我们经常需要统一配置项目的异常处理,又希望统一处理异常代码,同时不侵入原有的正常代码。我们可以通过以下三种方式实现统一处理项目的自定义异常。
通过SimpleMappingExceptionResolver类实现自定义异常的统一处理
通过实现比较简单,只需要进行bean配置即可
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <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>
这种方式简单并且具有良好的扩展性,对现有代码没有侵入性,但是除了异常信息外,无法接收其他的额外的参数信息。
特别说明:errorPage.jsp和login.jsp的存放目录必须在/WEB-INF/exception目录中。模型视图路径必须与异常提示文件的存放路径保持一致。
通过 实现HandlerExceptionResolver接口实现自定义异常的统一处理
- 首先配置bean,支持模型视图的解析
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean id="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/" p:suffix=".jsp"></bean>
- 实现HandlerExceptionResolver接口
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类
public class ProjectException extends RuntimeException { /** serialVersionUID */ private static final long serialVersionUID = 2332608236621015980L; public ProjectException () { super(); } public ProjectException (String message) { super(message); } }
当我们在代码异常地方抛出异常时系统自动讲异常显示到自定义的异常页面
throw new ProjectException("自定义异常页面");
采用这种方式不仅具有SimpleMappingExceptionResolver所有的有点,同时还可以额外传递参数。
通过Spring的@ExceptionHandler注解实现异常统一处理
看下面一个使用@ExceptionHandler 实现一个异常处理类
public class ExceptionController { /** 基于@ExceptionHandler异常处理 */ @ExceptionHandler public String exp(HttpServletRequest request, Exception ex) { /*要输出的异常参数*/ request.setAttribute("ex", ex); return "error"; } }
使用@ExceptionHandler 实现异常统一处理的方式简单,可扩展性强,只需要实现一个类似控制器的类,就可以了,不需要额外spring配置,但是这种方式有一个缺点是必须讲该类放在抛出异常的类同一个目录下,否则无法起作用,不够灵活,同时对于其他具有倾入性,对可能出现异常的地方需要继承该类(ExceptionController )。
异常提示的jsp文件路径
定义异常jsp文件的路径,如果要放在web-inf外面
<prop key="com.rrtong.frame.exception.GuideTestException">../../exception/error-interface</prop>