1. Spring MVC通过HandlerExceptionResolver处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常。
  2. Spring MVC提供的HandlerExcpetionResolver的实现类

image-20200921204212112.png

HandlerExceptionResolver

  1. DispatcherServlet默认装配的HandlerExceptionResolver:
    1. 没有使用 配置:
    2. image-20200921204451212.png
    3. 使用了配置:
    4. image-20200921204458405.png

ExceptionHandlerExceptionResolver

  1. 主要处理Handler中用@ExceptionHandler注解定义方法
  2. @ExceptionHandler注解定义的方法优先级问题:例如发生的是NullPointerException,但是声明的异常有RuntimeException和Exception,这时会根据异常的最近继承关系找到集成深度最浅的那一个 @ExceptionHandler注解方法,即标注了RuntimeExcpetion的方法。
  3. ExceptionHandlerMethodResolver内部若找不到@ExceptionHandler注解的话,会找@ControllerAdvice中的@ExceptionHandler注解方法

ResonseStatusExceptionResolver

  1. 在异常及异常父类中找到 @ResponseStatus 注解,然 后使用这个注解的属性进行处理。
  2. 定义一个 @ResponseStatus 注解修饰的异常类

    1. @ResponseStatus(HttpStatus.UNATHORIZED)
    2. public class UnathorizedException extends RuntimeException{}
  3. 若在处理器方法中抛出了上述异常 : 若ExceptionHandlerExceptionResolver 不解析述异常。由于 触发的异常 UnauthorizedException 带有@ResponseStatus 注解。因此会被ResponseStatusExceptionResolver 解析 到。最后响应HttpStatus.UNAUTHORIZED 代码给客户 端。HttpStatus.UNAUTHORIZED 代表响应码401,无权限。 关于其他的响应码请参考 HttpStatus 枚举类型源码。

DefaultHandlerExceptionResolver

对一些特殊的异常进行处理,比 如NoSuchRequestHandlingMethodException、HttpReques tMethodNotSupportedException、HttpMediaTypeNotSuppo rtedException、HttpMediaTypeNotAcceptableException 等。

SimpleMappingExceptionResolver

如果希望对所有异常进行统一处理,可以使用 SimpleMappingExceptionResolver,它将异常类名映射为 视图名,即发生异常时使用对应的视图报告异常

  1. <bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  2. <property name="exceptionMappings">
  3. <props>
  4. <prop key="java.lang.ArithmeticException">error</prop>
  5. </props>
  6. </property>
  7. </bean>