提到異常腦子浮現出一首去年很喜歡的歌 (very relatable🥹)
在現在這個數位化的時代,建構 robust、易於維護和彈性的系統變得越來越重要。當用戶遇到錯誤或異常時,提供清晰和有幫助的錯誤訊息能夠增加用戶體驗。Spring Boot 作為一個廣泛使用的 Java 的框架也提供了一系列的工具來處理例外/異常。Day 11 要來介紹 @ControllerAdvice
和 @ExceptionHandler
。
在傳統 Spring MVC 應用程式中,例外處理可能會散佈在整個系統中,不僅管理上困難,也增加了後續維護成本。但在 Spring Boot 中透過集中式的例外處理策略,可以讓結構更整潔。
@ExceptionHandler
是一個 method 層級的註釋,它可以捕捉並處理特定類型的例外。當 Controller 中的方法拋出特定的例外時,加上 @ExceptionHandler
註釋的方法將被呼叫。
通常,我們在 controller 內部用它來處理特定 controller 中可能發生的例外,是一個「局部」的例外處理策略。
雖然 @ExceptionHandler
提供了在 controller 處理例外的功能,但當多個 controller 有相同的例外處理邏輯時,這種方法可能會導致無數重複的程式碼。
這時,@ControllerAdvice
就派上了用場。這是一個 class 等級的註釋,用來定義「全域」的例外處理策略。通常會和 @ExceptionHandler
一起使用,這樣在整個應用程式範圍內的特定例外都可以被捕捉並處理。
@RestControllerAdvice
。旨在簡化程式碼,同時提供全域的例外處理,確保 repsonse 會以 JSON 或其他形式自動序列化。IllegalArgumentException
的例外,並回傳一個自定義的錯誤訊息。我們可以這樣做:@RestControllerAdvice
public class GlobalRestExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {
Map<String, String> errorMap = new HashMap<>();
errorMap.put("error", "Invalid argument");
errorMap.put("message", ex.getMessage());
return ResponseEntity.badRequest().body(errorMap);
}
}
在上述程式碼中:
@RestControllerAdvice
註釋來表示這是一個全域的 REST 例外處理器。@ExceptionHandler
註釋指定我們想要捕獲的例外類型。使用 @RestControllerAdvice
主要好處是不必在每個 @ExceptionHandler
方法上添加 @ResponseBody
(因為已經包含在 @RestControllerAdvice
中),並且確保了一致的異常處理。
Spring Boot 提供了強大的工具來幫助我們處理例外情況。透過 @ExceptionHandler
和 @ControllerAdvice
,我們可以建立清晰、組織化的例外處理策略。