Spring MVC处理异常有3种方式

  1. 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
  2. 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
  3. 使用@ExceptionHandler注解实现异常处理;
  4. Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进 行异常的处理
  5. image-20200113175102506

使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver

在SpringMVC配置文件中添加配置

image-20200113172213935

image-20191223184737733

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean 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="cn.basttg.core.exception.BusinessException">error-business</prop>
<prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop>

<!-- 这里还可以继续扩展对不同异常类型的处理 -->
</props>
</property>
</bean>

实现HandlerExceptionResolver 接口自定义异常处理器

实现HanderExceptionResolver接口

image-20200113174416593

image-20200113174641542

配置SpringMVC配置文件

image-20200113174734525

<bean id="sysExceptionResolver" class="com.kylin.exception.SysExceptionResolver"/>

使用@ExceptionHandler注解实现异常处理

由于单独使用只能处理 Controller 层未捕获(往外抛)的异常,对于 Interceptor(拦截器)层的异常,Spring 框架层的异常,就无能为力了,只能在当前Controller中处理异常。但当配合@ControllerAdvice一起使用的时候,就可以摆脱那个限制了。

image-20200113180450281

总结

综合上述可知,Spring MVC集成异常处理3种方式都可以达到统一异常处理的目标。从3种方式的优缺点比较,若只需要简单的集成异常处理,推荐使用SimpleMappingExceptionResolver即可;若需要集成的异常处理能够更具个性化,提供给用户更详细的异常信息,推荐自定义实现HandlerExceptionResolver接口的方式;若不喜欢Spring配置文件或要实现“零配置”,且能接受对原有代码的适当入侵,则建议使用@ExceptionHandler注解方式。