SpringMVC異常處理的三種方式
一、使用 @ExceptionHandler 註解
該方式進行異常處理的方法必須與出錯的方法在同一個Controller裡面。使用如下:
// 這個異常處理只會在本類中起作用
@ExceptionHandler(RuntimeException.class)
public String catchException(RuntimeException e){
System.out.println(e.getMessage());
return "error";
}
1
2
3
4
5
6
這種異常處理可以根據不同的異常在同一個Controller中配置多個,但是它們只能在該Controller中起作用。
二、實現 HandlerExceptionResolver 介面
HandlerExceptionResolver是SpringMVC為我們提供的一個統一異常處理的介面,實現機制也十分簡單。注意該類要注入到spring中。
@Component
public class GlobalException implements HandlerExceptionResolver {
// 自定義全局異常處理在mvc一直起作用
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
if (e instanceof MyException) {
return new ModelAndView("error1");
} else if (e instanceof RuntimeException){
return new ModelAndView("error2");
}
return new ModelAndView("error3");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
這種方式也可以進行異常處理,而且是全局。但是這種方式也有一定的弊端,全部的處理都打在一個方法裡面,沒有解耦合,後期不利於我們維護。
三、使用 @ControllerAdvice+ @ ExceptionHandler 註解
為了結合上面倆種方式的優點,Spring3.2為我們提供了一個新的註解@ControllerAdvice。注意該類要注入到spring中。
@ControllerAdvice
@Component
public class HandlerAndAdvice {
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST) //這裡還可以配置響應的狀態哦
@ResponseBody
public String catchRuntime() {
return "運行時發生了不可描述的錯誤偶偶偶偶局";
}
@ExceptionHandler(MyException.class)
public String catchMy(){
return "myError";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
這種方式在本類使用@ControllerAdvice+ @ExceptionHandler的方式實現全局配置,代碼解耦合,可以對不同的異常進行單獨處理,配置更加靈活,後期的維護和添加異常處理也更加方便。
打開今日頭條,查看更多圖片


※帶著新人學springboot的應用04(springboot+mybatis+redis 完)
※多線程互斥之Dekker演算法
TAG:程序員小新人學習 |