出現異常其實不可怕,可怕的是出現了異常,你卻不知道,也沒有進行異常處理。
Spring MVC的Controller出現異常的默許處理是響應1個500狀態碼,再把毛病信息顯示在頁面上,如果用戶看到這樣的頁面,1定會覺得你這個網站太LOW了。
要解決Controller的異常問題,固然也不能在每一個處理要求的方法中加上異常處理,那樣太繁瑣。Spring MVC提供了1個HandlerExceptionResolver接口,可用于統1異常處理。
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}
HandlerExceptionResolver接口中定義了1個resolveException方法,用于處理Controller中的異常。Exception ex參數即Controller拋出的異常。返回值類型是ModelAndView,可以通過這個返回值來設置異常時顯示的頁面。
HandlerExceptionResolver是1個interface,還需要定義1個實現類,來實現異常出現后的邏輯。
public class MyExceptionResolver implements HandlerExceptionResolver {
private ExceptionLogDao exceptionLogDao;
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
// 異常處理,例如將異常信息存儲到數據庫
exceptionLogDao.save(ex);
// 視圖顯示專門的毛病頁
ModelAndView modelAndView = new ModelAndView("errorPage");
return modelAndView;
}
}
上面代碼實現了HandlerExceptionResolver類的resolveException方法。出現異常時,會將異常信息存儲到數據庫,并顯示專門的毛病頁面。
固然,還有1些其他經常使用的異常處理方法,例如通過javamail將異常報警發送給相干人員。總之,出現的異常要能被相干人員看到,這樣才能不斷完善代碼。
最后,還需要將自己的HandlerExceptionResolver實現類配置到Spring配置文件中,或加上@Component注解。
<bean class="com.xxg.MyExceptionResolver" />
至此,MyExceptionResolver就能夠處理Controller拋出的異常了。
HandlerExceptionResolver只能處理所有的Exception,也就是HTTP狀態碼是500的異常,不能處理404、400等其他狀態碼對應的問題。
web.xml中配置error-page一樣是配置出現毛病時顯示的頁面:
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
如果resolveException返回了ModelAndView,會優先根據返回值中的頁面來顯示。不過,resolveException可以返回null,此時則展現web.xml中的error-page的500狀態碼配置的頁面。
當web.xml中有相應的error-page配置,則可以在實現resolveException方法時返回null。
API文檔中對返回值的解釋:
return a corresponding ModelAndView to forward to, or null for default processing.
上一篇 變量聲明有沒有分配內存?