java - 未调用使用 Thread.setDefaultUncaughtExceptionHandler 的 Spring Boot 控制台应用程序全局异常处理
问题描述
我有一个 Spring Boot 控制台应用程序(即不是 MVC 或 REST),我需要设置一个全局异常处理。@ControlerAdvice/@Messagehandler 显然不是选项,所以我尝试改用 Thread.setDefaultUncaughtExceptionHandler 。观察是抛出异常后,没有调用 Thread.setDefaultUncaughtExceptionHandlerhandler。我正在寻找关于为什么这不起作用的建议或关于使用不同策略的建议
@IntegrationComponentScan
@EnableIntegration
public class BatchLoaderCliApplication {
@PostConstruct
public void init() {
Thread.setDefaultUncaughtExceptionHandler((t,e)->System.out.println("in exception handler"));
}
@Bean
public ApplicationRunner runner() {
return args -> {
System.out.println(1/0)
};
}
java.lang.IllegalStateException: 无法在 org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) 在 org.springframework.boot 的 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:773) 执行 ApplicationRunner .SpringApplication.run(SpringApplication.java:318) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1213) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1202) 在 com.somecom。 batchloader.BatchLoaderCliApplication.main(BatchLoaderCliApplication.java:54) 引起:java.lang.ArithmeticException:/由零 在 com.somecom.batchloader.BatchLoaderCliApplication.lambda$1(BatchLoaderCliApplication.java:117) 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:770) ... 还有 5 个
解决方案
Spring Boot具有使用注册SpringBootExceptionReporter
实现的默认机制。默认情况下,有一个委托给FailureAnalyzer
实现,最后将结果传递给FailureAnalysisReporter
.
对于自定义处理,您可以
- 注册您的自定义
SpringBootExceptionReporter
以扩展/覆盖默认行为 - 注册自定义
FailureAnalyzer
以处理特定异常 - 注册一个自定义
FailureAnalysisReporter
来处理所有不同的失败
注册是通过添加一个本地文件来完成的,该文件META-INF/spring.factories
包含一个(属性格式)行,其中完整的 spring 接口名称作为键,所有实现作为值(逗号分隔)。
推荐阅读
- php - 如何使用 SplDoublyLinkedList 模仿这种双向链表动画?
- machine-learning - 多任务学习和多模型学习有什么区别?
- laravel - 在 Laravel 5.8 中安装 MDB Vue
- docker - 将 AdminApp 部署到 Websphere 9 Docker 时出现错误 401
- python - 尽管存在更快的互联网和元素,但 WebDriverWait 的超时异常
- python - 使用 Arcpy 从 ArcMap 导出向 PDF 添加边框
- python - 我目前正在尝试单击多个链接,这些链接将导致文件下载。但是我无法单击多个文件
- javascript - 我正在尝试运行脚本,但我采取的步骤不起作用。我哪里出错了?
- android - 为什么我的应用程序图标没有出现在模拟器或设备上?
- php - 为什么我的返回功能不起作用?