在Spring Boot應用程式中,捕獲全域性異常是一個重要的方面,它可以幫助我們處理在應用程式執行時可能發生的各種錯誤情況。透過適當地捕獲和處理這些異常,我們可以改善使用者體驗並及時採取必要的措施。
使用@ControllerAdvice和@ExceptionHandler
Spring Boot允許我們使用@ControllerAdvice註解和@ExceptionHandler註解來實現全域性異常處理。這使得我們可以集中處理應用程式中各處可能丟擲的異常,並提供統一的響應。
@ControllerAdvice
@ControllerAdvice是Spring框架提供的註解,用於標記全域性控制器的通用配置。它可以用於定義全域性異常處理器、全域性資料繫結器以及全域性模型屬性。
在原始碼中,@ControllerAdvice的作用是使帶有該註解的類成為全域性控制器配置的持有者。這意味著該類能夠捕獲應用程式中所有控制器中丟擲的異常,或者對控制器中的方法進行統一的前置或後置處理。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { // ... }
@Target(ElementType.TYPE):
表示該註解可以用於類、介面等。
@Retention(RetentionPolicy.RUNTIME):
指示該註解會在執行時保留,並透過反射等機制進行操作。
@Component:
表示@ControllerAdvice註解本質上也是一個Spring元件。
@ExceptionHandler
@ExceptionHandler是一個用於定義異常處理方法的註解。當結合@ControllerAdvice使用時,它可以指定在特定異常發生時應該執行的處理方法。
在原始碼中,@ExceptionHandler的作用是告訴Spring框架,當某個特定型別的異常被丟擲時,應該呼叫所標註的方法來進行處理。
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { Class<? extends Throwable>[] value() default {}; }
@Target({ElementType.METHOD, ElementType.TYPE})
表示該註解可以用於方法和類上。
@Retention(RetentionPolicy.RUNTIME)
指示該註解會在執行時保留,並透過反射等機制進行操作。
具體程式碼示例
首先,我們建立一個GlobalExceptionHandler類,並用@ControllerAdvice註解標記它。然後,我們在該類中定義具體的異常處理方法。
import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.http.HttpStatus; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public ResponseEntity<String> handleException(Exception e) { return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } // 可以根據需要新增其他異常處理方法 }
在上面的程式碼中:
我們建立了一個GlobalExceptionHandler類,並使用@ControllerAdvice註解將其標記為全域性異常處理器。@ExceptionHandler註解用於指定要捕獲的異常型別,並透過handleException方法來處理這些異常。
在這個示例中,我們捕獲了所有型別的Exception,並返回一個帶有錯誤訊息的500內部伺服器錯誤響應。在真實的應用程式中,我們還可以根據需要新增其他的異常處理方法,以滿足特定的業務需求。
透過以上程式碼示例,我們演示瞭如何在Spring Boot應用程式中捕獲全域性異常。這種方式可以讓我們更好地管理應用程式中可能發生的各種異常情況,並提供統一的異常處理機制。
往期面試題:
Java面試題:如果你這樣做,你會後悔的,兩次啟動同一個執行緒~~~
Java面試題:@PostConstruct、init-method和afterPropertiesSet執行順序?
Java面試題:SimpleDateFormat是執行緒安全的嗎?使用時應該注意什麼?
Java面試題:細數ThreadLocal大坑,記憶體洩露本可避免
Java面試題:請談談對ThreadLocal的理解?
Java面試題:為什麼HashMap不建議使用物件作為Key?
Java面試題:你知道Spring的IOC嗎?那麼,它為什麼這麼重要呢?
Java面試題:執行緒池內“鬧情緒”的執行緒,怎麼辦?
Java面試題:Spring Bean執行緒安全?別擔心,只要你不寫併發程式碼就好了!
Java面試題:Spring框架除了IOC和AOP,還有哪些好玩的設計模式?
Java面試題:Spring中的迴圈依賴,給程式設計師帶來的心理陰影
Java面試題:讓依賴注入變得簡單,面對@Autowired和@Resource,該如何選擇?