簡體   English   中英

如何在啟動時使 Spring Boot 自定義異常不致命?

[英]How to make Spring Boot custom exception on startup not fatal?

問題:我正在使用 Spring Boot 1.4.3 (spring-boot-starter-web) 並在啟動時運行可能引發異常的方法。 目前,如果拋出異常,Spring 會關閉 Tomcat 並退出。 我怎樣才能使這個例外成為非致命的? 換句話說,我仍然希望網絡服務器繼續運行。

這是我的代碼:

@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

異常僅在未處理時傳播到調用者或前一個堆棧,並以類似的方式使堆棧冒泡,最終導致線程的運行方法方法,以防它在主線程上。

要中斷傳播鏈,請在堆棧之一上優雅地處理兩者之間的異常。 在當前情況下,理想的地方是將代碼包裝在保護塊中

@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 。 但是實現細節是開發人員選擇和需要的基礎。

看起來是您的代碼可能會拋出異常,因此您的代碼也必須捕獲異常,以便它不會展開調用堆棧。

@EventListener
public void runOnStartup (ApplicationReadyEvent event){
    try {
        do_stuff_that_might_runtime_exception();
    } catch (Exception e) {
        log.error("something occurred", e);
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM