javascript
controller需要捕获异常吗_Spring之Controller异常处理
在Spring Web后端開發中,對于Controller方法的異常一般都需要特別處理,以防止將異常信息拋給前端或用戶。但是如果在各個Controller方法中通過try-catch來捕獲處理,不僅繁瑣而且代碼也不夠簡潔優雅。這里我們介紹如何通過@ExceptionHandler、@ControllerAdvice注解實現對Controller方法異常的統一處理
@ExceptionHandler 異常處理器注解
該注解標注的方法(即異常處理器),可以對其所在類的中的所有Controller方法(即@RequestMapping注解標注的方法)拋出的異常進行攔截,以便統一處理。同時可在該注解上指定所需捕獲的異常類型。同時該方法也支持通過添加@ResponseBody注解來向前端返回請求的響應結果。下述代碼即是一個該注解的使用實例
@Controller @RequestMapping("Student") public class StudentController { /*** 異常處理器* @param e* @return*/@ResponseBody // 通過異常處理器方法統一返回響應結果@ExceptionHandler(Exception.class)public String handleException1(Exception e) {String msg = "Get Exception In handleException1 Method";System.out.println("msg: " + msg);return msg;}/*** 運算異常處理器* @param e* @return*/@ResponseBody // 通過異常處理器方法統一返回響應結果@ExceptionHandler(ArithmeticException.class)public String handleException2(ArithmeticException e) {String msg = "Get ArithmeticException In handleException2 Method";System.out.println("msg: " + msg);return msg;}@ResponseBody@RequestMapping("/test1")public Integer test1(@RequestParam int a) {int b = 10 / a;System.out.println("b: " + b);return b;} }- 當通過Postman向 http://localhost:8088/Student/test1?a=tony 發送請求,Controller方法由于方法參數類型錯誤而拋出異常,然后該異常被傳遞到異常處理器 handleException1 方法中統一進行處理
- 當通過Postman向 http://localhost:8088/Student/test1?a=0 發送請求,Controller方法由于除0而拋出ArithmeticException運算異常。Controller方法中拋出的異常會被與異常處理器所指定攔截的異常類型繼承關系最近的異常處理器方法所攔截,所以,該運算異常被傳遞到運算異常處理器 handleException2 方法中統一進行處理
- 當通過Postman向 http://localhost:8088/Student/test1?a=2 發送請求,Controller方法未拋出異常,方法按正常流程執行并返回預期結果
@ControllerAdvice 控制器通知注解
雖然異常處理器大大方便了我們對于Controller方法中異常的處理,但是通常在一個項目中有多個Controller類,如果在每個Controller類添加重復的異常處理器方法顯然不夠簡潔優雅。比較容易想到的優化方案是將異常處理器方法放在Controller基類中,其他Controller類通過繼承該基類來獲得異常處理器,但是由于Java的單繼承問題,會使得其無法再繼承父類容易產生不便;還有一種優化方案是通過接口的默認方法實現(該特性從JDK 8開始支持),但是這樣需要其他Controller類都需要顯式地實現該接口,稍微有點麻煩。為此Spring FrameWork提供了一個控制器通知注解——@ControllerAdvice
@ControllerAdvice注解所標識類的異常處理器方法將會對項目中所有標注了@RequestMapping注解的方法生效(即項目中所有的Controller方法),這樣我們就可以很方便地統一處理所有Controller方法所拋出的異常,同時保證了Conrotller類的簡潔。值得一提的是@ControllerAdvice注解本身已經使用了@Component注解
/*** 所有Controller方法統一的異常處理:Controller異常處理器通知*/ @ControllerAdvice public class ControllerExceptionHandler {/*** 異常處理器* @param e* @return*/@ResponseBody@ExceptionHandler(Exception.class)public String handleException1(Exception e) {String msg = "Get Exception In handleException1 Method";System.out.println("msg: " + msg);return msg;}/*** 運算異常處理器* @param e* @return*/@ResponseBody@ExceptionHandler(ArithmeticException.class)public String handleException2(ArithmeticException e) {String msg = "Get ArithmeticException In handleException2 Method";System.out.println("msg: " + msg);return msg;} } ... @Controller @RequestMapping("Student") public class StudentController { ...@ResponseBody@RequestMapping("/test1")public Integer test1(@RequestParam int a) {int b = 10 / a;System.out.println("b: " + b);return b;}... }參考文獻
總結
以上是生活随笔為你收集整理的controller需要捕获异常吗_Spring之Controller异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚马逊评价抓取插件_亚马逊运营必备插件
- 下一篇: mysql8中文排序_mysql中utf