异常处理方式优先级
优先级递减,被一个捕获处理了就不会去执行其他的了。
异常处理方式 | 说明 |
---|---|
@ExceptionHandler | 单个 Controller 异常处理方法 |
@ControllerAdvice + @ExceptionHandler | 全局 Controller 异常处理类 |
HandlerExceptionResolver | 异常处理器实现类(内部有优先级规则) |
error-page | Tomcat 错误页 |
HandlerExceptionResolver 实现类的优先级
Spring 内置了几个 HandlerExceptionResolver 的实现类,我们还可以自定义一些实现类,它们的优先级有两种规则:
配置优先
配置顺序越靠前,优先级越高。
<!--自定义的异常处理器-->
<bean class="com.bear.exceptionResolver.GlobalHandlerExceptionResolver"/>
<!--内置的异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
通过 Ordered 排序
改用继承AbstractHandlerExceptionResolver
抽象类的方式创建异常处理器,通过重写其中的getOrder()
方法指定优先级。
order
的值越小,优先级越高。
public class GlobalHandlerExceptionResolver extends AbstractHandlerExceptionResolver {
public int getOrder() {
return 0;
}
原理:
Spring 内部通过
Ordered
接口定义优先级。
AbstractHandlerExceptionResolver
是HandlerExceptionResolver
的实现类,同时它也实现了Ordered
接口。
AbstractHandlerExceptionResolver
的子类们,除SimpleMappingExceptionResolver
之外,其他都被安排处理特定的异常,不需要我们手动配置。如:HttpRequestMethodNotSupportedException
异常默认会被DefaultHandlerExceptionResolver
捕获,假如我们想自己处理这个异常,就可以通过Ordered
将自定义异常处理器的优先级提高。