在web 項目中,遇到異常一般有兩種處理方式:try.....catch....;throw
通常情況下我們用try.....catch.... 對異常進行捕捉處理,可是在實際項目中隨時的進行異常捕捉,會造成代碼重復和繁雜,我們希望代碼中只有業務相關的操作,所有的異常我們單獨設立一個類來處理它。
首先,我們在可能發生異常的方法,全部throw出來,即dao拋給service、service給controller、controller拋給前端控制器;
然后由前端控制器調用 全局異常處理器 對異常進行統一處理
全局異常處理器處理思路:
首先解析出異常類型;
如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示
如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”)(應為一般業務異常我們並不希望被用戶知道,防止代碼泄露,造成不安全)
自定義異常一般是業務異常,這個異常的信息應該告知客戶,系統異常一般是代碼異常,一般寫日志
SpringMVC提供一個HandlerExceptionResolver接口,全局異常處理器實現此接口
定義一個全局異常處理類:將客戶異常的消息放入ModelAndView的model中,並在error頁面中顯示出來
public class ExceptionResolver implements HandlerExceptionResolver{ //該方法的的參數會自動獲取 請求(request),響應(response),異常(exception),handler(異常參數的處理器 Controller) public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView mav = new ModelAndView(); if(ex instanceof CustomException){ //用戶異常 mav.addObject("message", ex.getMessage()); mav.setViewName("error"); }else{
//系統異常 mav.addObject("message", "系統出現異常,請稍后訪問"); mav.setViewName("error"); } return mav; } }
在SpringMVC中生成該對象:
<!--配置異常對象處理器 該類要實現HandlerExceptionResolver接口 -->
<bean class="com.lh.excrption.ExceptionResolver"></bean>