目錄
SSM 統一異常處理
spring創建中, 處理異常可以使用try-cache處理, 也可以使用spring提供的統一異常處理
在spring中, 統一處理異常有2中方式
-
注解方式
@ExceptionHandler
作用於方法上@controlleradvice
作用於類上 -
接口方式
HandlerExceptionResolver
接口
注解方式
注解方式用起來也是比較方便的, 注解方式有兩種
@ExceptionHandler
單獨使用, 前提是拋出異常的方法和處理異常的方法在同一個controller下@controlleradvice
和@ExceptionHandler
配合使用, 如果當前controller下沒有處理異常的方法, 則去找@controlleradvice描述的類下面處理異常的方法
單獨使用@ExceptionHandler
此方式僅限於處理異常的方法和拋出異常的方法在同一個controller里
次注解的參數是可以處理異常的類型字節碼對象, 例如寫RuntimeException.class
則處理此異常以及其子類的異常, 處理異常的方法參數和注解的參數類型一般來說是一致的.
@Controller
public class GlobalController {
/**
* 用於處理異常的
*/
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.println(e.getMessage());
e.printStackTrace(); // 控制台打印報錯信息
return "exception";
}
// 此請求會拋出異常
@RequestMapping("/index")
public String test() {
throw new MyException("出錯了!");
return "index";
}
}
使用 @ControllerAdvice+ @ ExceptionHandler 注解
@ ExceptionHandler 需要進行異常處理的方法必須與出錯的方法在同一個Controller里面。那么當代碼加入了 @ControllerAdvice,則不需要必須在同一個 controller 中了。這也是 Spring 3.2 帶來的新特性。從名字上可以看出大體意思是控制器增強。 也就是說,@controlleradvice + @ ExceptionHandler 也可以實現全局的異常捕捉。
/**
* @ControllerAdvice 注解描述的類, spring mvc會分為他是
* 一個控制層全局異常的處理
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* @ExceptionHandler 注解描述的方法為異常處理方法,
* 次注解中定義的異常類型, 為這個方法可以處理的異常類型, 它可以處理
* 此異常以及這個異常類型的子類類型的異常
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
@ResponseBody // 告訴spring mvc最終相應結果轉換為json格式返回, 如果返回的是頁面可不寫次注解
public JsonResult doHandleRuntimeException(RuntimeException e) {
e.printStackTrace();
return new JsonResult(e);
}
// .....等多個處理異常的方法
}
實現 HandlerExceptionResolver 接口
即mvc中所有的異常都可以在這里進行處理
@Component
public class ExceptionTest implements HandlerExceptionResolver{
/**
* TODO 簡單描述該方法的實現功能(可選).
* @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;
}
}