Spring注解之@ExceptionHandler 統一異常處理和獲取方法名
摘要:在 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的用法和原理。希望這篇文章對您有所幫助,感謝閱讀!
Buy me a coffee. ?Get red packets.
浙公網安備 33010602011771號