目录
1、ErrorMvcAutoConfiguration包含的组件
ErrorMvcAutoConfiguration:自动配置异常处理规则
组件一、DefaultErrorAttributes:
组件二、BasicErrorController:
1浏览器响应html页面
2方法给服务器返回json串
组件三、DefaultErrorViewResolver
2、处理流程
1、执行目标方法
2、catch异常
3、异常被捕获后,进入视图解析流程(页面渲染)
4、mv=processHandlerException,处理handler发生的异常,处理完成返回ModelAndView
3.自定义
绑定了一些属性,从ServerProperties、WebMvcProperties得到
在容器中,添加Bean: DefaultErrorAttributes、 BasicErrorController 添加View,其name:error、BeanNameViewResolve组件(解析error视图)
当没有人为配置ErrorAttributes类型的组件时,
组件:(类型:DefaultErrorAttributes id:errAttribues)生效
定义了最终响应的错误里面包含的内容
,如exception、trace(堆栈信息)、message、errors
(类型:BasicErrorController id:basicErrorController)
处理:yml中的server.error.path(若写了) 、默认的/error路径的请求(响应默认错误页)
:ModelAndView("error", model)
容器中添加View-->id:error
此视图通过BeanNameViewResolver解析。在容器中按照组件的id找到视图的解析器
id:conventionErrorViewResolver
如果发生错误,错误状态码(404、500)就会作为视图页地址,找到真正页面 。这解释了error/路径下存在4xx..html、5xx.html,就能跳转到这些页面。
执行期间有任何异常都会被catch、而且标志当前请求结束,异常用dispatchException封装
目标方法执行成功则返回ModelAndView
目标方法存在异常,被catch住。封装成dispatchException(本例中为除0异常)
processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException)
mv因为目标方法没有执行成功,当前是null
1、遍历所有handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver
处理器异常解析器】
系统默认的异常解析器:
a、DefaultErrorAttributes先来处理异常,把异常保存在request域,并且返回空
b、默认没有任何人能处理异常,异常被抛出
如果没有任何人能处理,最终底层会发送/error请求。被BasicErrorController处理
解析错误视图,遍历所有ErrorViewResolver,看谁能解析这个异常
c、默认的DefaultErrorViewResolver,作用是把响应状态码作为错误页的地址,error/500.html
e、模板引擎最终响应这个页面
底层由ExceptionHandlerExceptionResolver支持
以为定义了我们自己的异常解析器优先级最高,所以下图我们自己的异常解析器最先被遍历到,只有第一个我们自己的异常解析器处理不了异常 时 ,在调用其他系统提供的异常解析器