controlleradvice、exceptionhandler和restcontroller中的try-catch块

rkue9o1l  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(461)

我有一个关于 @ControllerAdvice 以及 @ExceptionHandler . 我有一个休息控制器注解 @RestController 它有两个api。如果参数验证失败,则抛出 MethodArgumentNotValidException . 我创造了 ExceptionHandler 要处理此问题:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public ResponseEntity<String> handleException(MethodArgumentNotValidException e) throws Exception {
        return new ResponseEntity<>(e.getBindingResult().getGlobalError().getDefaultMessage(), HttpStatus.BAD_REQUEST);
    }
}

如果我想在这个异常发生时记录一些东西,我可以在之前添加一行代码吗 return 声明如下: LOG.info("something happened"); 它会记录它,然后将错误的请求返回给调用者吗?

9fkzdhlc

9fkzdhlc1#

如果我想在这个异常发生时记录一些东西,我能在return语句之前添加一行代码吗
log.info(“发生了什么事”);
它会记录它,然后将错误的请求返回给调用者吗?
对。这就是使用 @ExceptionHandler s。它们有助于减少跨项目中定义的多个rest端点处理异常的代码。这也可以作为单点记录异常,从而避免这种反模式:

//BAD
class SomeService {
    public SomeEntity someMethod() {
        try {
            /* stuff... */
        } catch (Exception e) {
            //No need to log the exception here
            log.error("An exception happened", e);
            throw e;
        }
    }
}

不过,您还是可以获得一些好处,比如 Package 异常并重新引用它们:

//GOOD
class SomeService {
    public SomeEntity someMethod(String param) {
        try {
            /* stuff... */
        } catch (Exception e) {
            //You may use this to perform other logic like setting specific message or wrap your exception
            log.error("Unexpected behaviour with param {}", param);
            throw new MyCustomException("Some message", e);
        }
    }
}

你可以想到 @ExceptionHandler 作为一个巨人 catch 阻止所有rest端点和特定类型的异常。
另外,你的 GlobalExceptionHandler 类成为具有相关逻辑的组件,以处理后端抛出的每个异常,并处理如何向客户端报告该异常。

相关问题