首页 > 解决方案 > 未调用使用 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 个

标签: javaspringspring-bootexceptionconsole-application

解决方案


Spring Boot具有使用注册SpringBootExceptionReporter实现的默认机制。默认情况下,有一个委托给FailureAnalyzer实现,最后将结果传递给FailureAnalysisReporter.

对于自定义处理,您可以

注册是通过添加一个本地文件来完成的,该文件META-INF/spring.factories包含一个(属性格式)行,其中完整的 spring 接口名称作为键,所有实现作为值(逗号分隔)。


推荐阅读