springmvc 全局異常解決方案
阿新 • • 發佈:2017-09-13
his let pre 普通 public .com tro 相同 extends
系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。
系統的dao、service、controller出現都通過throwsException向上拋出,最後由springmvc前端控制器交由異常處理器進行異常處理,如下圖:
1.自定義異常類:
package cn.itcast.ssm.exception; public class CustomerException extends Exception{ private String message;//異常信息 public CustomerException(String message){ this.message=message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
2.定義一個全局異常處理器實現HandlerExceptionResolver接口
思路:系統遇到異常,在程序中手動拋出,dao拋給service、service給controller、controller拋給前端控制器,前端控制器調用全局異常處理器。
全局異常處理器:解析出異常類型,如果該異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示,如果該異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”)
package cn.itcast.ssm.exception; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; public class CustomerExceptionResolver implements HandlerExceptionResolver{ public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 解析出異常類型 // 如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示 // 如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”) CustomerException customerException=null; if(ex instanceof CustomerException){ customerException=(CustomerException)ex; }else{ customerException=new CustomerException("未知錯誤!"); } String message = customerException.getMessage(); ModelAndView modelAndView=new ModelAndView(); modelAndView.addObject("message", message); modelAndView.setViewName("error"); return modelAndView; } }
如果出現錯誤就轉發到錯誤頁面error.jsp,直接在error.jsp使用EL表達式獲取異常信息顯示:${message}
3.在sprimgmvc.xml中定義全局異常處理器類(與普通的handler配置基本相同)
<!-- 全局異常處理 --> <bean class="cn.itcast.ssm.exception.CustomerExceptionResolver"></bean>
4.進行測試:對於修改頁面拋出拋出異常信息:
1).controller層拋出異常
2).service層拋出異常信息
3)訪問:
springmvc 全局異常解決方案