如何在启动时使Spring Boot自定义异常不致命?

时间:2017-01-12 19:49:52

标签: java spring spring-boot

问题:我正在使用Spring Boot 1.4.3(spring-boot-starter-web)并在启动时运行一个可能引发异常的方法。目前,如果抛出异常,Spring将关闭Tomcat并退出。我怎样才能使这个例外非致命?换句话说,我仍然希望Web服务器继续运行。

这是我的代码:

@EventListener
public void runOnStartup(ApplicationReadyEvent event) {
    do_stuff_that_might_runtime_exception();
}

但如果抛出我的自定义RuntimeException,我会看到:

..[info] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@77d67cf3: startup date [Thu Jan 12 13:23:03 CST 2017]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@2df3b89c
..[info] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0
..[info] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
..[info] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans
..[info] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@7b6860f9: startup date [Thu Jan 12 13:23:06 CST 2017]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@77d67cf3
..[info] o.apache.catalina.core.StandardService   : Stopping service Tomcat

2 个答案:

答案 0 :(得分:1)

异常只有在未处理时才传播到调用者或前一个堆栈,并以类似的方式冒泡堆栈,最终导致线程的 run method main < / strong>方法,以防它在主线程上。

打破传播链,在其中一个堆栈上优雅地处理异常。在当前情况下,理想的位置是将代码包装在保护块

@EventListener
public void runOnStartup(ApplicationReadyEvent event) {
    try {
      do_stuff_that_might_runtime_exception();
   } catch(RuntimeException runtimeException){
      // Handle Exception Here 
      runtimeException.printStackTrace();
   }
}

此外,始终确保您决定要处理的方案,并尝试避免一般异常捕获,它们可能会导致不必要的逻辑掩盖。例如,如果您希望受保护的块抛出FileNotFoundException,请尝试仅捕获FileNotFoundException,而不是RuntimeException或Exception或最差的Throwable。但实施细节是开发人员的选择和需求基础。

答案 1 :(得分:0)

看起来你的代码可能会抛出异常,因此它也是你必须捕获异常的代码,所以它不会解开callstack。

$watch