Spring註解之@ExceptionHandler 統一異常處理和獲取方法名

樓蘭胡楊發表於2023-09-25

摘要:在 Spring Boot 中,使用Spring註解@ControllerAdvice 和 @ExceptionHandler 統一處理異常,並捕獲方法名,從而快速定位錯誤原因。

背景分析

  最近走查線上環境日誌時,發現列印了很多org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported異常日誌,雖然知道是因為介面不支援GET請求導致的,但是,定位不到是因為錯誤呼叫哪個介面導致,給人很大困惑。

@ExceptionHandler介紹

  異常處理器@ExceptionHandler是Spring MVC框架中用於處理異常的註解,方法名按需自定義,方法引數可以是Exception及其子類物件、HttpServletRequest、HttpServletResponse等,系統會自動為它們賦值。方法返回值型別可以為ModelAndView、Model、Map、View、String以及void等。它的作用是把各個Controller中丟擲的異常集中到一個類中處理。

  在被@ControllerAdvice或者@RestControllerAdvice修飾的類裡,可以使用@ExceptionHandler捕捉異常,返回值型別為Map的示例如下:

@Slf4j
@RestControllerAdvice
public class GlobalExceptionAdvice {
	/*
   * 捕捉HTTP請求方式異常HttpRequestMethodNotSupportedException
   */
   @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
   public Map<String, Object> handleBadMethodException(HttpRequestMethodNotSupportedException exception, HttpServletRequest req) {
       log.error("不支援的請求方式:{}-{}", req.getRequestURI(), exception.getMessage());
       Map<String, Object> result=new HashMap();
       result.put("msg","不支援的請求方式");
       result.put("code", HttpStatus.METHOD_NOT_ALLOWED.value());
       return result;
   }
}

  @RestControllerAdvice:放在類的上面,表示這個類中有異常處理器,它是基於AOP的、對控制器類的一個增強。

  req.getRequestURI()用於獲取當前API訪問路徑的URI,裡面包含方法名,用於快速定位是哪個API出錯。

  在上述異常處理器示例中,當控制層丟擲HttpRequestMethodNotSupportedException異常時,handleBadMethodException方法會被呼叫,返回一個包含錯誤資訊的Map物件。如果把@ExceptionHandler(HttpRequestMethodNotSupportedException.class)改為@ExceptionHandler(Exception.class),則是處理全域性異常了,會捕獲所有未被其它方法處理的異常,這樣處理的缺點是異常太過寬泛,不利於排查問題。

  驗證功能的方法很簡單,請使用GET請求訪問僅支援POST請求的函式,此時,控制檯將列印如下資訊:

不支援的請求方式:/wiener/XXXMethod-Request method 'GET' not supported

結束語

  Spring MVC的@ExceptionHandler註解為Web應用程式提供了便捷的異常處理機制。透過使用該註解,可以在控制器中捕獲和處理特定型別的異常,提供友好的錯誤資訊給使用者。在實際專案中,合理使用@ExceptionHandler能夠提高程式碼的可維護性和使用者體驗。透過本文的解析和實踐,讀者可以更好地理解和掌握@ExceptionHandler的用法和原理。希望這篇文章對您有所幫助,感謝閱讀!

相關文章