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