Spring MVC异常处理方式主要有:
1、直接使用框架提供的简单异常处理器SimpleMappingExceptionResolver;
2、自定义异常处理器,实现HandlerExceptionResolver接口;
3、使用注解的方式实现一个专门用于处理异常的Controller——ExceptionHandler。
**第一种**SimpleMappingExceptionResolver是AbstractHandlerExceptionResolver的子类,也是实现了HandlerExceptionResolver接口。而AbstractHandlerExceptionResolver这个抽象类中的一些参数,可以在Spring上下文中配置一个exceptionResolver的异常处理类,同时进行诸如exceptionMappings、statusCodes、warnLogCategory、defaultStatusCode、defaultErrorView等配置,从而实现简单的异常处理的目的。
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">errors/error</prop>
<prop key="java.lang.Throwable">errors/err</prop>
</props>
</property>
<property name="statusCodes">
<props>
<prop key="errors/error">500</prop>
<prop key="errors/404">404</prop>
</props>
</property>
<property name="warnLogCategory" value="WARN"></property>
<property name="defaultErrorView" value="errors/error"></property>
<property name="defaultStatusCode" value="500"></property>
</bean>
第二种自定义异常处理器,比第一种更加的灵活,可以自定义不同的异常,并且对不同的异常进行不同方式的处理。比如如何设置怎么样的返回码,转到什么页面,记录怎么样的日志,都可以进行特殊处理。具体实现方式也是首先在Spring上下文配置中,配置一个自定义异常处理类,如:
<!-- 异常拦截器 -->
<bean id="myExceptionResolver"
class="com.nazir.web.interceptor.MyExceptionResolver" />
然后MyExceptionResolver实现HandlerExceptionResolver,并重写resolveException方法,下面是一个简单的例子:
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
Map<String, Object> model = new HashMap<String, Object>();
model.put("ex", ex);
if (ex instanceof SignException) {
logger.error("签名错误");
model.put("code", -2);
return new ModelAndView("error-sign", model);
} else if (ex instanceof ParameterException) {
model.put("code", -1);
logger.error("参数错误");
return new ModelAndView("error-parameter", model);
} else {
return new ModelAndView("error", model);
}
}
}