SpringBoot错误处理 错误处理器自动化配置原理 异常处理执行流程 自定义异常处理

一、异常处理

SpringBoot在无论客户端或者是服务端发生错误的时候,都有一套错误处理映射,也就是为我们跳转到某个页面,或者给我们返回某些信息;当然我们也可以自定义这套规则

1. 默认的错误处理规则

  • SpringBoot默认也有一套错误处理/ERROR的映射
  • 当我们是手机,或者说是机器客户端访问,出错时候,就会为我们返回一些JSON信息
    在这里插入图片描述
  • 当我们是浏览器端访问,出现错误时候,也会为我们响应到对应的错误处理页面
    在这里插入图片描述

2. 自定义错误页面

  • 创建我们的error目录,并且将错误页面命名为4xx、5xx格式,Springboot会为我们自动找到这些页面。
    在这里插入图片描述

那么SpringBoot是如何做到的呢,下面我们就会进入我们的源码环节

二、自动化配置原理

1. 自动配置错误处理组件

ErrorMvcConfiguration组件

  1. 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;
	}

在这里插入图片描述

  1. BaseErrorController(JSON+白页错误显示)
    • public class BasicErrorController extends AbstractErrorController
    • 默认处理/error请求;new ModelAndView("error)
    • 容器当中有一个id:error的View组件(定义了白页显示的样子)
    • 容器当中有一个BeanNameViewResolver 组件(可以通过名称,来找到视图)
    • error,就是个StaticView页;
      在这里插入图片描述
      2.1 浏览器错误响应
      在这里插入图片描述
      2.2 机器客户端错误响应JSON
      在这里插入图片描述
  2. DefaultErrorViewResolver(将http状态码作为跳转地址)
    • public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered
    • 通过状态码,来确定跳转页面地址 error/[viewName].html

三、异常处理流程

1. 流程步骤

  1. 执行目标方法,在执行目标方法的时候,出现任何错误,或者异常,都会被catch.(标志请求结束,并且用dispatchException)
  2. mv = processHandlerException;处理handler发生的异常,处理完成返回ModelAndView;
    1. 遍历所有的HandlerExceptionResolver,来确定哪个能处理这个异常
    2. 系统默认的异常处理器解析器
      在这里插入图片描述
      2.1 DefaultErrorAttributes:用于将错误信息放入到Request域当中,并且返回NUll;
      2.2 默认没有人能够处理异常,而抛出异常,重定向/error,会被底层当中BaseController处理;
      2.3 错误页面的解析: 遍历所有的ErrorViewResolver
      在这里插入图片描述
      2.4 默认使用DefaultErrorViewResolver进行处理,就是将响应状态码作为条状的地址.
      2.5 最终模板引擎响应。

2. 异常处理器解析器

  1. 用于将异常信息添加到request域对象当中
  2. 能够处理@ExceptionHandlerException注解
  3. 处理自定义
    在这里插入图片描述

四、自定义异常处理机制

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  {
}

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值