SpringBoot异常处理步骤流程

异常处理步骤流程

设置异常:
SpringBoot异常处理步骤流程_第1张图片


步骤:
1、执行目标方法,如果目标方法执行成功就返回ModelAndView,但是目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 dispatchException封装异常
SpringBoot异常处理步骤流程_第2张图片

image.png

SpringBoot异常处理步骤流程_第3张图片


2、进入视图解析流程(页面渲染?)

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

image.png
如果目标方法正确执行,mv就有值,但是上面目标方法有异常,所以mv就是空,并且dispatchException是算数异常
SpringBoot异常处理步骤流程_第4张图片


3、mv = processHandlerException;处理handler发生的异常,处理完成返回ModelAndView;

  • 1、遍历所有的 handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver处理器异常解析器
    SpringBoot异常处理步骤流程_第5张图片
    处理完异常后,如果结果不为空,就返回ModelAndView
    SpringBoot异常处理步骤流程_第6张图片

    2、系统默认的 异常解析器;
    SpringBoot异常处理步骤流程_第7张图片

    • 1、DefaultErrorAttributes先来处理异常。把异常信息保存到rrequest域,并且返回null;

      • SpringBoot异常处理步骤流程_第8张图片
      • SpringBoot异常处理步骤流程_第9张图片

      • 相当于调用这个方法,这个接口规定如果自定义了一个异常解析器,刚才是哪个目标方法发生了异常,然后可以在这个方法内部自定义这个异常该怎么处理,只需要返回一个ModelAndView。所以最终你哪怕是自定义异常解析器,你也要给我返回一个ModelAndView,这样spring底层就会知道异常处理完要跳转到哪个页面,页面里放什么数据。
        SpringBoot异常处理步骤流程_第10张图片

        遍历完默认的异常解析器后发现处理不了,所以异常会被抛出
    • 2、默认没有任何人能处理异常,所以异常会被抛出
      ■ 1、如果没有任何人能处理最终底层就会发送 /error 请求。会被底层的BasicErrorController处理SpringBoot异常处理步骤流程_第11张图片
      ■ 2、解析错误视图;遍历所有的 ErrorViewResolver 看谁能解析。SpringBoot异常处理步骤流程_第12张图片image.png
      3、默认的 DefaultErrorViewResolver ,作用是把响应状态码作为错误页的地址,并拼接成error/500.htmlSpringBoot异常处理步骤流程_第13张图片SpringBoot异常处理步骤流程_第14张图片4、模板引擎最终响应这个页面 error/500.htmlSpringBoot异常处理步骤流程_第15张图片

总结:如果发生了异常,会调用系统的默认异常解析器解析,如果系统的默认异常解析器解析不了,底层就会发/error请求,转给BasicErrorController 处理,BasicErrorController 调用底层的ErrorViewResolver处理。(你也可以自定义ErrorViewResolver,决定怎么处理)
主要牵扯到两个环节:
(1)会调用系统的默认异常解析器解析,系统的默认异常解析器能不能解析。
(2)DefaultErrorAttributes永远返回为空,相当于它只保存了一个错误信息,保存错误信息
的意义其实就是为了下次,下次如果没有任何人能处理,就会发/error请求,而我们又从请求域
中拿到上次的错误信息,相当于数学的算术异常。所有的异常解析器都处理不了,最终调用底层的
默认异常错误处理机制DefaultErrorAttributes,最终得到错误页。

你可能感兴趣的:(javaspringboot)