在没有任何错误的情况下抛出异常

时间:2018-01-31 16:47:02

标签: java spring spring-boot exception-handling exit-code

我在IntelliJ中有一个Spring Boot应用程序,最初配置为正常启动,如下所示:

public static void main(String[] args) throws Exception {
    SpringApplication.run(AccountApiApplication.class, args).close();
}

我在main方法中添加了一个try-catch块来处理启动期间发生的任何错误(比如缺少配置文件等),它现在看起来像:

public static void main(String[] args) throws Exception {
        try {
            SpringApplication.run(AccountApiApplication.class, args).close();
        }
        catch(Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

添加后,我的应用程序总是退出,退出代码为1.即使没有错误。我尝试打印正在发生的异常,它是这样的:

org.springframework.boot.devtools.restart.SilentExitExceptionHandler$SilentExitException
    at org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread(SilentExitExceptionHandler.java:90)
    at org.springframework.boot.devtools.restart.Restarter.immediateRestart(Restarter.java:184)
    at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:163)
    at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:552)
    at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationStartingEvent(RestartApplicationListener.java:67)
    at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationEvent(RestartApplicationListener.java:45)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)
    at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:68)
    at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:48)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
    at edu.iu.es.ebs.AccountApiApplication.main(AccountApiApplication.java:90)

Process finished with exit code 1

为什么即使应用程序中没有错误,我也会看到此异常?虽然我们在这里,有没有比在main中添加try-catch更好的方法来处理不可预测的启动错误?

2 个答案:

答案 0 :(得分:2)

这是一种正常的Spring Boot应用程序工作方式,它的依赖项中包含org.springframework.boot:spring-boot-devtools。默认情况下,org.springframework.boot.devtools.restart.Restarter在初始化后立即重新启动应用程序。要摆脱SilentExitException,你应该通过将属性spring.devtools.restart.enabled设置为false来摆脱重新启动器,但我不认为这个例外是一个大问题。

答案 1 :(得分:1)

首先,我认为问题是对close()的调用。正如您在Stacktrace中看到的那样,该方法可以生成由SilentExitException吞噬的SilentExitExceptionHandlerexample

其次,最好使用接口FailureAnalizer来捕获应用程序启动时的错误,它可以为您提供有关错误的更多信息。