<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近使用shiro做個項目,也包括幾個萬精油框架spring、mybatis</span>
其實用springmvc來實現全局異常處理我在一起的學習demo中也用到了,今天因爲有些地方不是那麼清晰了,所以乾脆寫成博客,記錄下來。
用springmvc實現全局異常處理我知道的有兩種方式:
1、繼承HandlerExceptionResolver實現個自定義的全局異常處理器,重寫resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex)
有4個參數,第一個(請求當前的HTTP請求)、第二個(響應當前的HTTP響應)、第三個(處理程序執行處理程序)、第四個(拋出的異常)
就是當你的程序拋出異常時,會回調這個方法。我們可以根據Exception的類型做出不同的處理
if(ex instanceof CustomException){
<span style="white-space:pre"> </span>System.out.println("這是自定義異常");
}ielse if(ex instanceof Exception){
<span style="white-space:pre"> </span>System.out.println("這是系統異常");
}
最後這個方法返回一個ModelAndView 可以把錯誤信息顯示在頁面上
要spring知道我們自定義了這個全局異常處理器只需在 spring配置文件中加入這個bean
<bean class="com.zzger.CustomHandlerExceptionResolver"/>
2、使用@ExceptionHandler註解來處理異常,我也非常喜歡這種方式,最重要的一點是它可以返回任何東西,不只是一個ModelAndView,可以是json等等..
可以在我們自己的controller中的方法上加上這個註解
<span style="white-space:pre"> </span>@ExceptionHandler(CustomException.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public MessageVo CustomException(CustomException ex){
MessageVo vo = new MessageVo();
vo.setStatus(ex.getStatus());
vo.setMessage(ex.getMessage());
return vo;
}
這是我的一個示例@ExceptionHandler裏的參數是你想處理那個異常的class,上面的代碼意思就是這個方法會處理所有拋出CustomException的異常
<pre name="code" class="java">@ResponseBody是把返回值按json輸出
@ResponseStatus是修改此次的http響應碼
然後今天就有一個地方忘記了
我把所以的ExceptionHandler單獨放到了一個Controller中,可是出現異常的時候沒有效果,原來我以前是把其他controller繼承此Controller,所以纔有效果
不過spring3.2之後提供了一個註解@ControllerAdvice,可以把當前的@ExceptionHandler在所以的@RequestMapping方法上都有效哦
嗯,因爲我現在喜歡用ajax來和後臺進行交互,所以第二種方式處理異常真是太棒了,寫安卓的時候同樣如此