
SpringMVC 異常統一處理的三種方式:
- 使用 @ExceptionHandler 注解
- 實現 HandlerExceptionResolver 接口
- 使用 @ControllerAdvice 注解
總結
當以上三個方式,一起出現時,只執行執行范圍最小的方式,后面的方式不再執行處理;
執行范圍:@ExceptionHandler < @ControllerAdvice+@E..Handler < HandlerExceptionResolver
人話:當某個Mapping方法發生異常后,先由@ExceptionHandler 處理;如果沒有上者,則由@ControllerAdvice+@E..Handler 處理;如果沒有上者 則由 HandlerExceptionResolver 處理
-
使用 @ExceptionHandler 注解
作用域:局部,針對一個Controller中的指定異常類;
注有該注解的方法,和發生異常的Mapping方法,兩者需要在同一個Controller里;
@Controller
@ResponseBody
public class Cors {
@RequestMapping("/cors")
public String reqShow(HttpServletRequest request){
// 發生 ArithmeticException 異常
int i = 1/0;
// 是否是 Ajax 請求
return "XMLHttpRequest".
equalsIgnoreCase(request.getHeader("X-Requested-With"));
}
// @ExceptionHandler 參數為 要處理器的 異常類(或子類)
@ExceptionHandler(ArithmeticException.class)
public String exInfo(ArithmeticException e){
System.out.println(e.getMessage());
return "seccess";
}
}
-
實現 HandlerExceptionResolver 接口
作用域:全局,針對全部Controller,無需指定某個異常類;
HandlerExceptionResolver 接口 中 只有 resolveException 一個方法,實現即可;
@Component
public class HandlerEx implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) {
System.out.println(e.getMessage());
return null;
}
}
-
使用 @ControllerAdvice 注解
作用域:全局,針對全部Controller中的指定異常類;
該注解需要 和@ExceptionHandler配合,來完成全局異常的處理;
注意:兩個注解的配合,發生異常Mapping方法 與 @ExceptionHandler注解的方法 就可以不用寫在同一個Controller 里;
@Controller
@ResponseBody
public class Cors {
@RequestMapping("/cors")
public String reqShow(){
// 發生 ArithmeticException 異常
int i = 1/0;
return "hello";
}
}
@ControllerAdvice
public class AppAllException{
@ResponseStatus(HttpStatus.BAD_REQUEST) // 響應 狀態碼400
// @ExceptionHandler 參數為 要處理器的 異常類(或子類)
// 注解參數不聲明指定異常類,則默認為方法列表中的異常參數類
@ExceptionHandler(ArithmeticException.class)
public void showInfo(Exception e){
System.out.println(e.getMessage());
}
}
此時,依然堅持寫在同一個Controler里的話,未嘗不可。不改變的是:作用域仍是全局的;例子如下
@Controller
@ControllerAdvice
public class ShiroAllException {
@RequestMapping("/cors")
public String reqShow(){
int i = 1/0;
return "hello";
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ArithmeticException.class)
public void showInfo(Exception e){
System.out.println(e.getMessage());
}
}