错误处理的默认规则(什么都不配的情况下的规则)
默认情况下,Spring Boot提供/error处理所有错误的映射
对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据如下图:
异常处理自动配置原理
在处理handler发生的异常,遍历所有的 handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver处理器异常解析器】
- 首先使用DefaultErrorAttributes先来处理异常,把异常信息保存到request域中,并且返回为null。
- 接着使用ExceptionHandlerExceptionResolver和ResponseStatusExceptionResolver和DefaultHandlerExceptionResolver进行解析。
- ExceptionHandlerExceptionResolver处理@ControllerAdvice+@ExceptionHandler处理全局异常
- @ResponseStatus+自定义异常 ;底层是ResponseStatusExceptionResolver , 把
responsestatus注解的信息底层调用 response.sendError(statusCode, resolvedReason),tomcat发送的/error,这里的/error会被底层的BasicErrorController处理。 - Spring底层的异常,如参数类型转换异常;DefaultHandlerExceptionResolver 处理框架底层的异常。
- 如果上面默认没有任何人处理器处理异常,就会被抛出。
BasicErrorController处理流程
自定义错误页
error/404.html error/5xx.html;有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页
@ControllerAdvice+@ExceptionHandler处理全局异常;
底层是 ExceptionHandlerExceptionResolver 支持的,处理标注了ExceptionHandler注解的异常解析器
@ResponseStatus+自定义异常====》@ResponseStatus:自定义异常
底层是 ResponseStatusExceptionResolver ,即标注了 ResponseStatus注解的异常处理解析器
把responsestatus注解的信息底层调用response.sendError(statusCode, resolvedReason);tomcat发送的/error
Spring底层的异常,如参数类型转换异常;DefaultHandlerExceptionResolver 处理框架底层的异常。
底层默认由tomcat发送/error请求,sendError立即结束当前请求,但是springmvc底层有basicErrorController专门来处理/error请求,如果用户没有自定义错误页,那么默认显示错误白页
自定义异常解析器
实现HandlerExceptionResolver,重写resolveException()方法,然后把这个类加到springboot容器中(可以使用@Component放到容器中)。
注意:直接放到容器中不能使用,因为这个放到容器中我们解析器会被放到最后一个(优先级最低),使用@Order(),调整优先级。