iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

Spring Boot 三十天挑戰賽系列 第 11

Day 11 - Handle those Exceptions - SpringBoot 中的例外處理

  • 分享至 

  • xImage
  •  

提到異常腦子浮現出一首去年很喜歡的歌 (very relatable🥹)

Yes

在現在這個數位化的時代,建構 robust、易於維護和彈性的系統變得越來越重要。當用戶遇到錯誤或異常時,提供清晰和有幫助的錯誤訊息能夠增加用戶體驗。Spring Boot 作為一個廣泛使用的 Java 的框架也提供了一系列的工具來處理例外/異常。Day 11 要來介紹 @ControllerAdvice@ExceptionHandler

1. SpringBoot的例外處理

在傳統 Spring MVC 應用程式中,例外處理可能會散佈在整個系統中,不僅管理上困難,也增加了後續維護成本。但在 Spring Boot 中透過集中式的例外處理策略,可以讓結構更整潔。

2. @ExceptionHandler:處理特定控制器的例外

@ExceptionHandler 是一個 method 層級的註釋,它可以捕捉並處理特定類型的例外。當 Controller 中的方法拋出特定的例外時,加上 @ExceptionHandler 註釋的方法將被呼叫。
通常,我們在 controller 內部用它來處理特定 controller 中可能發生的例外,是一個「局部」的例外處理策略。

3. @ControllerAdvice:全域的例外處理策略

雖然 @ExceptionHandler 提供了在 controller 處理例外的功能,但當多個 controller 有相同的例外處理邏輯時,這種方法可能會導致無數重複的程式碼。
這時,@ControllerAdvice 就派上了用場。這是一個 class 等級的註釋,用來定義「全域」的例外處理策略。通常會和 @ExceptionHandler 一起使用,這樣在整個應用程式範圍內的特定例外都可以被捕捉並處理。

4. @RestControllerAdvice:結合 @ControllerAdvice 和 @ResponseBody

  • @ControllerAdvice:這是一個全域例外處理 class 的註解。當在應用程式中有一個或多個例外處理邏輯需要在多個 controller 間共享時,通常會使用它。
  • @ResponseBody:這是一個告訴 Spring 每次 response 都需要將返回的物件序列化為 JSON 或 XML 格式,然後放入 HTTP 回應的內容中。
  • 當我們將兩者組合在一起會得到 @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);
    }
}

在上述程式碼中:

  1. @RestControllerAdvice 註釋來表示這是一個全域的 REST 例外處理器。
  2. 使用 @ExceptionHandler 註釋指定我們想要捕獲的例外類型。
  3. 建立了一個錯誤 map,帶上錯誤訊息和具體的異常資訊。
  4. 最後,回傳一個帶有錯誤 mapping 的 HTTP response。

使用 @RestControllerAdvice 主要好處是不必在每個 @ExceptionHandler 方法上添加 @ResponseBody(因為已經包含在 @RestControllerAdvice 中),並且確保了一致的異常處理。


Spring Boot 提供了強大的工具來幫助我們處理例外情況。透過 @ExceptionHandler@ControllerAdvice,我們可以建立清晰、組織化的例外處理策略。


上一篇
Day 10 - RESTful: @RestController & @RequestMapping
下一篇
Day 12 - Spring Data JPA - 從基礎到實作
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言