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