异样解决步骤流程
设置异样:
步骤:
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,最终失去谬误页。