异常处理的作用
可以拦截制定异常,并进行处理返回到制定页面。
需求举例
如我的需求当用户请求不存的页面时不能出现浏览器默认的404页面,而出现我自己定义的html也面。当出现A类异常时返回到a.html。出现B类异常返回带b.html。
项目实例
例如:当为我根本没有
ind123ex.html服务请求时。
如果我不自定义错误处理器。返回404页面
当自定义错误处理器,处理NoHandlerFoundException(404的异常)异常后返回制定的请求页面。当然你也可以拦截自定义的异常,返回到不同的页面。
以下部分对Spring异常处理器执行和加载源码进行分析
1、DispatcherServlet这个前端配置器中初始化的策略对象如下图
2、initHandlerExceptionResolvers为初始化异常处理类。
可以看到初始化异常处理集合是通过类型从上下文获取。并且通过sort对异常处理器集合排序。
排序的作用:
当发生异常时,根据异常处理器的顺序来处理异常,当有异常处理其能够处理当前异常信息时,就不再执行后面的异常处理器了。
3、异常处理信息排序 根据对象的 Order属性进行排序,如果不是Order对象类那么排序就靠后。
4、执行异常处理,可以看到当发生异常时候,按顺序执行异常处理器(this.handlerExceptionResolvers)。当有异常处理器能够处理当前一场(exMv != null)。则后面的异常处理器都不会执行。
5、默认异常顺序设置:
源代码在
org.springframework.web.servlet.config.
AnnotationDrivenBeanDefinitionParser
类注释说明
可以看到
<annotation-driven/> 自动加载的异常处理 ,默认加载三个分别是(
ExceptionHandlerExceptionResolver、
ResponseStatusExceptionResolver、
DefaultHandlerExceptionResolver
)。
6、加载源代码分析。
在org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser 类中有分别加载上面三个异常处理器的代码如下。
①、ExceptionHandlerExceptionResolver
②、ResponseStatusExceptionResolver
③、DefaultHandlerExceptionResolver![](https://img-blog.csdn.net/20151030160435637?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看到三个异常加载器的Order分别为(0,1,2)。
6、自定义异常处理器
(继承AbstractHandlerExceptionResolver【可设置顺序】或者HandlerExceptionResolver【不能设置顺序】)以及设置异常处理类的执行顺序
7、如果考虑自定异常处理器比默认异常处理器的优先级高。那么一定要考虑设置 Order。
如果有什么错误的地方, 欢迎大家多多指正。