java的异常处理类是一个很好的学习模板,通过web容器、springmvc的异常处理,可以帮助我们很好的回顾交互逻辑,理清楚springmvc控制层(controller)与页面(client)的逻辑交互关系。
一、容器是怎么处理异常的?
(1)、在web.xml中配置error-page,在eclipse的下面有提示信息,根据配置可以处理异常,在异常发生时跳转到我们设置的异常页面
配置信息如下:
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/pages/errors/notfoundexception.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/WEB-INF/pages/errors/nullpointerexception.jsp</location>
</error-page>
(2)、在对应的jsp文件抬头信息设置 isErrorPage=”true”
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true" %>
(3)、在jsp页面可以通过四大域中的pageContext域的ErrorData属性获取绑定的异常信息,以下为el表达式获取信息:
<h2>请求资源路径:${pageContext.errorData.requestURI}</h2>
<h2>异常Servlet:${pageContext.errorData.servletName }</h2>
<h2>状态码:${pageContext.errorData.statusCode }</h2>
二、springmvc是怎么处理异常的?
1、使用@ExceptionHandler注解配置处理
(1)开启注解驱动:
<mvc:annotation-driven></mvc:annotation-driven>
(2)在出现异常的controller类中编写异常处理的方法,在方法中配置@ExceptionHandler注解
@ExceptionHandler({Exception.class})//注册注解,指定传入的异常类型参数
public String dealExcepiton(HttpServletRequest request,Exception e){
request.setAttribute("e", e);//设置request对象,方便传送给到客户端
return "/errors/exceptionhandler";//跳转到异常处理页面
}
(3)在方法返回的客户端,通过上面方法中设定的request属性获取异常信息,从而显示在客户页面:
<h2>系统出现了非预期的异常,请联系系统管理员确认处理...</h2>
<%
Exception e = (Exception)request.getAttribute("e");
out.println(e.getMessage());
out.println(e.getClass());
out.println(e.getCause());
%>
注意: 如果存在多个@ExceptionHandler注解的方法,则进入离异常类型最近的方法,先进入小异常的处理。
总结:这种捕获异常的方式可以针对本类中每个方法可能出现的异常进行单独捕获 ,但是对于我们的代码有侵入性
2、自定义异常处理类实现HandlerExceptionResolver接口
(1)、自定义类来处理异常实现HandlerExceptionresolver接口
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception e) {
ModelAndView modelAndView = new ModelAndView();
return modelAndView;
}
}
(2)、配置该类到spring容器,通过注解方式,并实现异常逻辑:
@Controller
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("e", e);
modelAndView.setViewName("/errors/notfoundexception");//文件路径已**视图解析器**通过InternalResourceViewResolver的配置前缀,后缀
return modelAndView;
}
}
(3)在上面跳转的jsp页面中,可以在request中获取异常信息:
<%
Exception e = (Exception)request.getAttribute("e");
out.println(e.getMessage());
out.println(e.getClass());
%>
也可以使用pageContext的errorData获取异常信息:
<h2>请求地址: ${pageContext.errorData.requestURI} </h2>
<h2> 状态码 : ${pageContext.errorData.statusCode} </h2>
<h2>异常 : ${pageContext.errorData.throwable} </h2>
<h2>servlet名称 :${pageContext.errorData.servletName} </h2>