SpringBoot——错误处理

目录

1、ErrorMvcAutoConfiguration包含的组件

ErrorMvcAutoConfiguration:自动配置异常处理规则

组件一、DefaultErrorAttributes:

 组件二、BasicErrorController:

 1浏览器响应html页面

 2方法给服务器返回json串

组件三、DefaultErrorViewResolver

2、处理流程

1、执行目标方法

 2、catch异常 

 3、异常被捕获后,进入视图解析流程(页面渲染)

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

3.自定义


1、ErrorMvcAutoConfiguration包含的组件

SpringBoot——错误处理_第1张图片

ErrorMvcAutoConfiguration:自动配置异常处理规则

绑定了一些属性,从ServerProperties、WebMvcProperties得到

 

在容器中,添加Bean:
DefaultErrorAttributes、
BasicErrorController
    添加View,其name:error、BeanNameViewResolve组件(解析error视图)

组件一、DefaultErrorAttributes:

当没有人为配置ErrorAttributes类型的组件时,
组件:(类型:DefaultErrorAttributes id:errAttribues)生效
SpringBoot——错误处理_第2张图片

定义了最终响应的错误里面包含的内容 

,如exception、trace(堆栈信息)、message、errors 

SpringBoot——错误处理_第3张图片

 组件二、BasicErrorController:

(类型:BasicErrorController   id:basicErrorController)

SpringBoot——错误处理_第4张图片

处理:yml中的server.error.path(若写了) 、默认的/error路径的请求(响应默认错误页)

 1浏览器响应html页面

:ModelAndView("error", model)

SpringBoot——错误处理_第5张图片

容器中添加View-->id:error

此视图通过BeanNameViewResolver解析。在容器中按照组件的id找到视图的解析器 

SpringBoot——错误处理_第6张图片

 2方法给服务器返回json串

组件三、DefaultErrorViewResolver

id:conventionErrorViewResolver

SpringBoot——错误处理_第7张图片

SpringBoot——错误处理_第8张图片

如果发生错误,错误状态码(404、500)就会作为视图页地址,找到真正页面 。这解释了error/路径下存在4xx..html、5xx.html,就能跳转到这些页面。

2、处理流程

1、执行目标方法

执行期间有任何异常都会被catch、而且标志当前请求结束,异常用dispatchException封装

SpringBoot——错误处理_第9张图片

 

 2、catch异常 

       目标方法执行成功则返回ModelAndView

       目标方法存在异常,被catch住。封装成dispatchException(本例中为除0异常)

SpringBoot——错误处理_第10张图片

SpringBoot——错误处理_第11张图片

 3、异常被捕获后,进入视图解析流程(页面渲染)

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

mv因为目标方法没有执行成功,当前是null

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

 1、遍历所有handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver

处理器异常解析器】

SpringBoot——错误处理_第12张图片

系统默认的异常解析器:

SpringBoot——错误处理_第13张图片

     a、DefaultErrorAttributes先来处理异常,把异常保存在request域,并且返回空

     b、默认没有任何人能处理异常,异常被抛出

         如果没有任何人能处理,最终底层会发送/error请求。被BasicErrorController处理

        解析错误视图,遍历所有ErrorViewResolver,看谁能解析这个异常

SpringBoot——错误处理_第14张图片

   c、默认的DefaultErrorViewResolver,作用是把响应状态码作为错误页的地址,error/500.html

   e、模板引擎最终响应这个页面

3.自定义

1、@ControllerAdvice加@ExceptionHandler,处理全局异常

底层由ExceptionHandlerExceptionResolver支持

SpringBoot——错误处理_第15张图片

 2、@ResponseStatus+自定义异常,底层由ResponseStatusExceptionResolver支持

SpringBoot——错误处理_第16张图片

 SpringBoot——错误处理_第17张图片

3、编写自己的异常解析器

SpringBoot——错误处理_第18张图片

 以为定义了我们自己的异常解析器优先级最高,所以下图我们自己的异常解析器最先被遍历到,只有第一个我们自己的异常解析器处理不了异常 时 ,在调用其他系统提供的异常解析器

SpringBoot——错误处理_第19张图片 

 

你可能感兴趣的:(SpringBoot,spring,boot,java,后端)