在 main 中抛出异常而没有任何错误

Posted

技术标签:

【中文标题】在 main 中抛出异常而没有任何错误【英文标题】:Exception being thrown in main without any errors 【发布时间】:2018-01-31 16:47:01 【问题描述】:

我在 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 更好的方法来处理不可预测的启动错误?

【问题讨论】:

你为什么要用这个.close()关闭你的应用程序? @pvpkiran 因为如果我不这样做,它就不会退出。我的意思是它不会以“进程以退出代码 0 结束”或“进程以退出代码 1 结束”之类的方式结束。它以“Started Application ...”结束。我最终将通过 shell 脚本调用应用程序,因此我需要它结束并向脚本返回退出代码。 @lebowski 这是一个不同的问题。如果您检查 Spring Boot 应用程序生命周期 (docs.spring.io/spring-boot/docs/current/reference/html/…),您可以看到应用程序在准备好工作时处于“已启动应用程序”上是正常的。如果您需要“最终”执行,您应该检查Schedule 功能 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我尝试删除 close() 方法,但我仍然收到该异常。

以上是关于在 main 中抛出异常而没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章

Selenium WebDriver 在线程“main”org.openqa.selenium.ElementNotInteractableException 中抛出异常

在同步子句中抛出异常的副作用?

为啥在 ios/cordova 中抛出这个异常?

返回带有错误的响应,而不是在验证管道 mediatr 3 中抛出异常

如何捕获 node_modules 中抛出的异常

如何在 Symfony2 中抛出 403 异常?