我想确保我的团队始终记录抛出的异常。有没有办法捕获 Spring Boot 应用程序中的所有异常(无论入口点)?
使用@ControllerAdvice
(和
@RestControllerAdvice
)的答案是这个问题的错误答案,因为它只捕获由
@Controller
组件启动的代码的异常。代码可以通过多种不同的方式启动,例如 @JmsListener
带注释的方法在从队列接收消息时运行。由 JmsListener 启动的代码中引发的异常不会被 ControllerAdvice 中的处理程序捕获。
使用@ControllerAdvice(和@RestControllerAdvice)的这个答案是这个问题的错误答案,因为它只捕获由@Controller组件启动的代码的异常。代码可以通过多种不同的方式启动,例如 @JmsListener 注解的方法在从队列接收消息时运行。由 JmsListener 启动的代码中引发的异常不会被 ControllerAdvice 中的处理程序捕获。
要捕获 Spring Boot 应用程序中的所有异常,无论入口点如何,您都可以创建一个实现
class GlobalExceptionHandler
的 HandlerExceptionResolver interface
。
您可以在此类的
resolveException()
方法中记录异常或执行任何其他必要的操作来处理异常。
您还需要通过将以下 bean 添加到 Spring Boot 配置文件来将
class GlobalExceptionHandler
添加到应用程序上下文。
@Bean
public HandlerExceptionResolver globalExceptionHandler() {
return new GlobalExceptionHandler();
}
现在 Spring Boot 应用程序中所有未捕获的异常都将由
resolveException()
中的 class GlobalExceptionHandler
方法处理。
附注
class GlobalExceptionHandler
比 @ControllerAdvice
更通用。它可用于处理任何类型代码的异常,而 @ControllerAdvice
仅用于处理由 @Controller
组件启动的代码的异常。