springMVC 统一异常处理异常处理类的使用
?在項(xiàng)目開發(fā)中各層中都會(huì)不可避免的遇到各種可預(yù)知和不可預(yù)知的異常需要處理,為只專注業(yè)務(wù)邏輯的實(shí)現(xiàn),需要將異常信息進(jìn)行統(tǒng)一管理維護(hù)處理。
???????? springmvc就是將異常層層向外拋出,最后由springmvc的前端控制器調(diào)用異常處理組件HandlerExceptionResolver(處理器異常解析器)進(jìn)行處理
————————————————
統(tǒng)一處理某一類異常,能夠減少代碼的重復(fù)度和復(fù)雜度,有利于代碼的維護(hù)。springmvc統(tǒng)一處理異常有三種方式
- @ExceptionHandler
? ? 使用@ExceptionHandler注解作用在方法上面,參數(shù)是具體的異常類型。一旦系統(tǒng)拋出這種類型的異常時(shí),會(huì)引導(dǎo)到該方法來處理。但是它的缺陷很明顯
處理異常的方法和出錯(cuò)的方法(或者異常最終拋出來的地方)必須在同一個(gè)controller,不能全局控制。
@RequestMapping(value = "/error111",method = RequestMethod.GET)@ResponseBodypublic ResultBean error111(){service.test();// int i = 1/0;return null;}@ExceptionHandler(RuntimeException.class)@ResponseBodypublic String error3(){return "run time exception";}@org.springframework.stereotype.Service public class Service {public void test(){int i = 1/0;} }- @ControllerAdvice +?@ExceptionHandler
使用@ControllerAdvice 和@ExceptionHandler? 可以全局控制異常,使業(yè)務(wù)邏輯和異常處理分隔開。
@ControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(MyException.class)@ResponseBodypublic ResultBean handleMyException(MyException e){System.out.println("handleMyException....");return new ResultBean(e.getErrorEnum().getCode(),e.getErrorEnum().getMsg());}}public class MyException extends RuntimeException {private ErrorEnum errorEnum;public MyException(ErrorEnum errorEnum){this.errorEnum = errorEnum;}public ErrorEnum getErrorEnum() {return errorEnum;} }public enum ErrorEnum {SystemError("999","系統(tǒng)異常,請聯(lián)系管理員"),MyError1("001","自定義異常1"),MyError2("002","自定義異常2"),MyError3("003","自定義異常3");private String code;private String msg;ErrorEnum(String code,String msg){this.code = code;this.msg = msg;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;} }@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class ResultBean <T>{private final String SUCCESSCODE = "000";private final String SUCCESSMSG = "請求成功";/***999 : 請求失敗 (系統(tǒng)異常:這時(shí)候具體問題原因要去看日志)*000 : 請求成功**001 : 自定義異常1,用戶一眼就能看出問題在哪*002 : 自定義異常2,用戶一眼就能看出問題在哪*003 : 自定義異常3,用戶一眼就能看出問題在哪****/public String code;public String message;public T data;public ResultBean(){this.code = SUCCESSCODE;this.message = SUCCESSMSG;}public ResultBean(String code, String message) {this.code = code;this.message = message;}public ResultBean(T data) {this();this.data = data;} }實(shí)現(xiàn)?HandlerExceptionResolver 接口
@Component public class MyException implements HandlerExceptionResolver{ /** * TODO 簡單描述該方法的實(shí)現(xiàn)功能(可選). * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception) */ public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("This is exception handler method!"); return null; } }優(yōu)先級
既然在SpringMVC中有兩種處理異常的方式,那么就存在一個(gè)優(yōu)先級的問題:
當(dāng)發(fā)生異常的時(shí)候,SpringMVC會(huì)如下處理:
(1)SpringMVC會(huì)先從配置文件找異常解析器HandlerExceptionResolver
(2)如果找到了異常異常解析器,那么接下來就會(huì)判斷該異常解析器能否處理當(dāng)前發(fā)生的異常
(3)如果可以處理的話,那么就進(jìn)行處理,然后給前臺返回對應(yīng)的異常視圖
(4)如果沒有找到對應(yīng)的異常解析器或者是找到的異常解析器不能處理當(dāng)前的異常的時(shí)候,就看當(dāng)前的Controller中有沒有提供對應(yīng)的異常處理器,如果提供了就由Controller自己進(jìn)行處理并返回對應(yīng)的視圖
(5)如果配置文件里面沒有定義對應(yīng)的異常解析器,而當(dāng)前Controller中也沒有定義的話,就看有沒有全局ControllerAdvice提供的全局異常處理器,如果沒有那么該異常就會(huì)被拋出來。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的springMVC 统一异常处理异常处理类的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea查看方法的返回类型和自动出来变量
- 下一篇: 记录一个解决了一个下午加一个晚上的问题,