在Web应用中针对于异常情况的处理我们通常是会定义一个错误页面,然后发生错误的时候就会跳转到具体的错误页面。
err code配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <error-page> <error-code>404</error-code> <location>/WEB-INF/jsp/errors/error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/jsp/errors/error.jsp</location> </error-page> <error-page> <error-code>414</error-code> <location>/WEB-INF/jsp/errors/error.jsp</location> </error-page> <error-page> <error-code>505</error-code> <location>/WEB-INF/jsp/errors/error.jsp</location> </error-page> <error-page> <error-code>400</error-code> <location>/WEB-INF/jsp/errors/error.jsp</location> </error-page>
|
通过此种方式可以捕获到resoonse的错误返回码,然后可以跳转到错误页面。
异常类型配置
1 2 3 4
| <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/WEB-INF/jsp/errors/error.jsp</location> </error-page>
|
此种方式我们可以捕获具体的异常,并跳转到错误页面。如果我们程序中代码写得不太好,可能会抛出各种runtimeException.
这时候仅仅配置error page就cover不到这种情况,需要上面的代码进行处理。
SpringMVC异常处理
HandlerExceptionResolver接口
1 2 3
| public interface HandlerExceptionResolver { ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex); }
|
通过HandlerExceptionResolver接口可以实现对controller中的异常进行捕获,并给出相应的处理逻辑。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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; } }
|
SpringMVC 和 error page
默认会优先调用HandlerExceptionResolver的实现类进行处理异常,如果HandlerExceptionResolver中resolveException的返回值为null,就会默认调用error page中定义的处理方式进行处理。
总结
对于web项目的异常处理,我们的处理方式通常可以采用 spring异常配置 + error page 配合进行处理,保证能够cover所有的异常情况的处理。
参考资料