springboot:错误处理机制

1、默认规则

  • 默认情况下,Spring Boot提供/error处理所有错误的映射
  • 对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据。对于其它的一些客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息

 

  • 对于 “ whitelabel”错误视图,是springboot默认提供的处理/error请求的BasicErrorController处理后返回给浏览器的结果,要想替换默认提供的controller,可以实现 ErrorController 并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以替换其内容。
  • 静态资源路径下的error/4xx.html,5xx.html会替换默认的“ whitelabel”视图

2、定制错误处理逻辑

2.1、自定义错误页

  • error/404.html   error/5xx.html;有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页

2.2、处理异常的方式

  • @ControllerAdvice+@ExceptionHandler处理全局异常;底层是 ExceptionHandlerExceptionResolver 支持的
@ControllerAdvice
public class ExceptionController {
    //处理指定的异常
    @ExceptionHandler({NullPointerException.class,ArithmeticException.class})
    public String exceptionHandler(Exception e){
        System.out.println(e);
        return "login";
    }
}
  • @ResponseStatus+自定义异常 ;底层是 ResponseStatusExceptionResolver 进行解析处理,被responsestatus注解的异常类,底层会调用 response.sendError(statusCode, resolvedReason)(即tomcat发送的/error)
@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "自定义的错误")
public class MyException extends RuntimeException {
    public MyException(){}
    public MyException(String msg){
        super(msg);
    }
}
  • Spring底层的异常,如参数类型转换异常;DefaultHandlerExceptionResolver 处理框架底层的异常。response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
@Order(Ordered.HIGHEST_PRECEDENCE)//定义优先级,使得优先使用自定义的处理异常的解析器,否则
//springboot会使用默认的两个处理异常的解析器,轮不到咱们自定义的
@Component
public class MyHandleExceptionrResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        try {
            httpServletResponse.sendError(519,"自定义的错误");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return new ModelAndView();
    }
}

 3、异常处理自动配置原理

  • ErrorMvcAutoConfiguration  自动配置异常处理规则
  • 容器中的组件:类型:DefaultErrorAttributes -> bean id:errorAttributes
  • public class DefaultErrorAttributes implements ErrorAttributes, HandlerExceptionResolve

image.png

image.png

  • DefaultErrorAttributes:定义错误页面中可以包含哪些数据。
  • 容器中的组件:类型:BasicErrorController --> bean id:basicErrorController(json+白页 适配响应)

       处理默认 /error 路径的请求;页面响应 new ModelAndView("error", model)

  • 容器中放组件 BeanNameViewResolver(视图解析器);按照返回的视图名作为组件的id去容器中找View对象。

       容器中有组件 View->id是error;(响应默认错误页)

              容器中的组件:类型:DefaultErrorViewResolver -> id:conventionErrorViewResolver

       如果发生错误,会以HTTP的状态码 作为视图页地址(viewName),找到真正的页面

       error/404、5xx.html

 

image.png写出去json

image.png

4、异常处理流程步骤 

1、执行目标方法,目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 dispatchException

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

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

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

  • 遍历所有的 handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver处理器异常解析器

image.png

  • 系统默认的异常解析器

image.png

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

2、默认没有任何解析器能处理异常,所以异常会被抛出

  • 如果没有任何解析器能处理最终底层就会发送 /error 请求。会被底层的BasicErrorController处理
  • 解析错误视图;遍历所有的  ErrorViewResolver  看谁能解析。

image.png

  • 默认的 DefaultErrorViewResolver ,作用是把响应状态码作为错误页的地址,error/500.html
  • 模板引擎最终响应这个页面 error/500.html

你可能感兴趣的:(SpringBoot)