咱們常常須要統一配置項目的異常處理,又但願統一處理異常代碼,同時不侵入原有的正常代碼。咱們能夠經過如下三種方式實現統一處理項目的自定義異常。html
經過實現比較簡單,只須要進行bean配置便可java
<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加先後綴 --> <bean id="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/exception" p:suffix=".jsp"></bean> <!-- 配置SimpleMappingExceptionResolver異常處理--> <bean name="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView" value="error"></property> <!-- 定義異常處理頁面用來獲取異常信息的變量名,默認名爲exception --> <property name="exceptionAttribute" value="ex"></property> <!--定義須要特殊處理的異常,用類名或徹底路徑名做爲key,異常也頁名做爲值--> <property name="exceptionMappings"> <props> <prop key="com.myproject.frame.exception.NotLoginException">login</prop> <prop key="java.lang.Exception">errorPage</prop> </props> </property> </bean>
這種方式簡單而且具備良好的擴展性,對現有代碼沒有侵入性,可是除了異常信息外,沒法接收其餘的額外的參數信息。web
特別說明:errorPage.jsp和login.jsp的存放目錄必須在/WEB-INF/exception目錄中。模型視圖路徑必須與異常提示文件的存放路徑保持一致。spring
<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加先後綴 --> <bean id="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/" p:suffix=".jsp"></bean>
public class ProjectExceptionHandler implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { /*定義model傳輸model到頁面*/ Map<String, Object> model = new HashMap<String, Object>(); model.put("ex", ex); return new ModelAndView("error", model); } }
ex爲咱們自定義的異常處理類,咱們自定義一個ProjectException類app
public class ProjectException extends RuntimeException { /** serialVersionUID */ private static final long serialVersionUID = 2332608236621015980L; public ProjectException () { super(); } public ProjectException (String message) { super(message); } }
當咱們在代碼異常地方拋出異常時系統自動講異常顯示到自定義的異常頁面jsp
throw new ProjectException("自定義異常頁面");
採用這種方式不只具備SimpleMappingExceptionResolver全部的有點,同時還能夠額外傳遞參數。ide
看下面一個使用@ExceptionHandler 實現一個異常處理類ui
public class ExceptionController { /** 基於@ExceptionHandler異常處理 */ @ExceptionHandler public String exp(HttpServletRequest request, Exception ex) { /*要輸出的異常參數*/ request.setAttribute("ex", ex); return "error"; } }
使用@ExceptionHandler 實現異常統一處理的方式簡單,可擴展性強,只須要實現一個相似控制器的類,就能夠了,不須要額外spring配置,可是這種方式有一個缺點是必須講該類放在拋出異常的類同一個目錄下,不然沒法起做用,不夠靈活,同時對於其餘具備傾入性,對可能出現異常的地方須要繼承該類(ExceptionController )。code
異常提示的jsp文件路徑htm
定義異常jsp文件的路徑,若是要放在web-inf外面
<prop key="com.rrtong.frame.exception.GuideTestException">../../exception/error-interface</prop>