文章目录
一、异常处理
SpringBoot在无论客户端或者是服务端发生错误的时候,都有一套错误处理映射,也就是为我们跳转到某个页面,或者给我们返回某些信息;当然我们也可以自定义这套规则
1. 默认的错误处理规则
- SpringBoot默认也有一套错误处理/ERROR的映射
- 当我们是手机,或者说是机器客户端访问,出错时候,就会为我们返回一些JSON信息
- 当我们是浏览器端访问,出现错误时候,也会为我们响应到对应的错误处理页面
2. 自定义错误页面
- 创建我们的error目录,并且将错误页面命名为4xx、5xx格式,Springboot会为我们自动找到这些页面。
那么SpringBoot是如何做到的呢,下面我们就会进入我们的源码环节
二、自动化配置原理
1. 自动配置错误处理组件
ErrorMvcConfiguration组件
- DefaultErrorAttributes -> id:de’faultErrorAttributes
public class DefaultErrorAttributes implements ErrorAttributes, HandlerExceptionResolver, Ordered
- 定义了错误页面包含的信息…
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
Map<String, Object> errorAttributes = getErrorAttributes(webRequest, options.isIncluded(Include.STACK_TRACE));
if (Boolean.TRUE.equals(this.includeException)) {
options = options.including(Include.EXCEPTION);
}
if (!options.isIncluded(Include.EXCEPTION)) {
errorAttributes.remove("exception");
}
if (!options.isIncluded(Include.STACK_TRACE)) {
errorAttributes.remove("trace");
}
if (!options.isIncluded(Include.MESSAGE) && errorAttributes.get("message") != null) {
errorAttributes.put("message", "");
}
if (!options.isIncluded(Include.BINDING_ERRORS)) {
errorAttributes.remove("errors");
}
return errorAttributes;
}
- BaseErrorController(JSON+白页错误显示)
public class BasicErrorController extends AbstractErrorController
- 默认处理/error请求;new ModelAndView("error)
- 容器当中有一个id:error的View组件(定义了白页显示的样子)
- 容器当中有一个BeanNameViewResolver 组件(可以通过名称,来找到视图)
- error,就是个StaticView页;
2.1 浏览器错误响应
2.2 机器客户端错误响应JSON
- DefaultErrorViewResolver(将http状态码作为跳转地址)
public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered
- 通过状态码,来确定跳转页面地址 error/[viewName].html
三、异常处理流程
1. 流程步骤
- 执行目标方法,在执行目标方法的时候,出现任何错误,或者异常,都会被catch.(标志请求结束,并且用dispatchException)
mv = processHandlerException;处理handler发生的异常,处理完成返回ModelAndView;
- 遍历所有的HandlerExceptionResolver,来确定哪个能处理这个异常
- 系统默认的异常处理器解析器
2.1 DefaultErrorAttributes:用于将错误信息放入到Request域当中,并且返回NUll;
2.2 默认没有人能够处理异常,而抛出异常,重定向/error,会被底层当中BaseController处理;
2.3 错误页面的解析: 遍历所有的ErrorViewResolver
2.4 默认使用DefaultErrorViewResolver进行处理,就是将响应状态码作为条状的地址.
2.5 最终模板引擎响应。
2. 异常处理器解析器
- 用于将异常信息添加到request域对象当中
- 能够处理@ExceptionHandlerException注解
- 处理自定义
四、自定义异常处理机制
1. 自定义页面
我们可以自定义html页面,以状态码命名(4xx.html、5xx.html)之类,ErrorViewResolver会帮我们通过状态码跳转到响应的html页面
2. @ControllerAdivce+ExceptionHandler
- 有ExceptionHandlerResolver支持
@ControllerAdvice //控制器驱动
public class GloabeExeceptionHandler {
@ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class})//能处理的异常
public String handMath(Exception e){
System.out.println(e);
return "main"; //跳转路径地址
}
}
3. @ResponseStatus
- 设置返回状态码:底层到/error
@ResponseStatus(value = HttpStatus.BAD_REQUEST,reason = "乱点的")
public class OtherExeption {
}
结束