问题:我正在使用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
答案 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