异常处理步骤流程
设置异常:
步骤:
1、执行目标方法,如果目标方法执行成功就返回ModelAndView,但是目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 dispatchException
封装异常
2、进入视图解析流程(页面渲染?)
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
如果目标方法正确执行,mv就有值,但是上面目标方法有异常,所以mv就是空,并且dispatchException是算数异常
3、mv = processHandlerException;处理handler发生的异常,处理完成返回ModelAndView;
1、遍历所有的 handlerExceptionResolvers,看谁能处理当前异常【
HandlerExceptionResolver处理器异常解析器
】
处理完异常后,如果结果不为空,就返回ModelAndView2、系统默认的 异常解析器;
1、DefaultErrorAttributes先来处理异常。把异常信息保存到rrequest域,并且返回null;
相当于调用这个方法,这个接口规定如果自定义了一个异常解析器,刚才是哪个目标方法发生了异常,然后可以在这个方法内部自定义这个异常该怎么处理,只需要返回一个ModelAndView。所以最终你哪怕是自定义异常解析器,你也要给我返回一个ModelAndView,这样spring底层就会知道异常处理完要跳转到哪个页面,页面里放什么数据。
遍历完默认的异常解析器后发现处理不了,所以异常会被抛出
- 2、默认没有任何人能处理异常,所以异常会被抛出
■ 1、如果没有任何人能处理最终底层就会发送 /error 请求。会被底层的BasicErrorController处理
■ 2、解析错误视图;遍历所有的 ErrorViewResolver 看谁能解析。
■ 3、默认的 DefaultErrorViewResolver ,作用是把响应状态码作为错误页的地址,并拼接成error/500.html■ 4、模板引擎最终响应这个页面 error/500.html
总结:如果发生了异常,会调用系统的默认异常解析器解析,如果系统的默认异常解析器解析不了,底层就会发/error请求,转给BasicErrorController 处理,BasicErrorController 调用底层的ErrorViewResolver处理。(你也可以自定义ErrorViewResolver,决定怎么处理)
主要牵扯到两个环节:
(1)会调用系统的默认异常解析器解析,系统的默认异常解析器能不能解析。
(2)DefaultErrorAttributes永远返回为空,相当于它只保存了一个错误信息,保存错误信息
的意义其实就是为了下次,下次如果没有任何人能处理,就会发/error请求,而我们又从请求域
中拿到上次的错误信息,相当于数学的算术异常。所有的异常解析器都处理不了,最终调用底层的
默认异常错误处理机制DefaultErrorAttributes,最终得到错误页。
目标方法执行,方法执行期间出现异常,然后处理异常,遍历所有的异常解析器看哪个能解析就用哪个,有异常解析器能解析的话,就调用该异常解析器的解析异常方法解析。解析完后返回modelAndView。如果异常解析器解析不了,就会发送/error请求,转BasicErrorController 处理,BasicErrorController 调用底层的ErrorViewResolver处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。