概述
在公司写项目的时候发现,虽说我们异常采用了全文捕获的方式,这一点不是很清楚,特此梳理文章来记录下,自己学习的过程
先要会用
首先我们要思考一个问题: 它是怎么样子捕获异常的?我们都知道我们前后端交互如下图:
-
过程如下:
-
- 前端通过Http请求访问后端
-
- spring项目通过web.xml配置接受前端请求的方式参考Jsp + Servlet的项目(以后有机会补上),将请求都映射到spring-mvc.xml这个文件中(一般情况下)
-
- 这个样子就完成了前端到后端的映射
-
在以上步骤中我们需要进入一个前置操作那就是拦截器,在我们前端刚刚要访问后端的时候首先是web.xml之后就需要进入拦截器(可以组成拦截器链)
因此,我们可以推断拦截器也是采用了类似的机制类似于过滤器,只不过一个在前一个在后,而我们的的拦截器也恰好满足这个特性如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9NtHVpsk-1592134456791)(https://s1.ax1x.com/2020/06/14/tx7z0e.png)]
- Workflow interface that allows for customized handler execution chains.
- Applications can register any number of existing or custom interceptors
- for certain groups of handlers, to add common preprocessing behavior
- without needing to modify each handler implementation.
意思是说: 这是一个工作流程接口,可以去执行我们自定义的过滤链路,可以在这个过滤链路中注册任意数量的自定义拦截器,对于整个过滤器链路来说,主要是为了添加一些处理程序的通用逻辑而不是为每一个程序都去定义一个处理器
根据方法再次做出推断:
-
- 异常的拦截跟afterCompletion有关系,我们是否能够根据这个方法自己处理异常再返回给前端呢?
-
- 必定用到了AOP的技术
扯得有点远了,下面我们说下基本用法以及我的感悟
SpringBoot中的基本应用
定义异常类
public class OrderException extends RuntimeException {
private int code;
public OrderException(int code) {
this.code = code;
}
public OrderException(String message) {
super(message);
}
@Override
public String getMessage() {
return super.getMessage();
}
public int getCode() {
return this.code;
}
@Override
public String toString() {
return getMessage();
}
}
我们都知道我们最定级的异常是Throwable它下面的异常类图如下:
我们的类OrderException是继承RuntimeException的,RuntimeException的大体意义是: 它是那些JVM中运行的类,正常运行的,抛出异常是由程序操作不严谨,程序编写有逻辑或者语法错误所导致的
下面看下我们的拦截器,前面已经分析过了,它的作用类比于HandlerInterceptor中的afterInterceptor(),如下代码:
@ControllerAdvice
public class BingExceptionHandler {
// 自定义异常返回对应编码
@ExceptionHandler(OrderException.class)
@ResponseBody
public ResultModel handlerOrderException(OrderException e) {
return new ResultModel(false,e.getMessage());
}
@ExceptionHandler(Exception.class)
@ResponseBody
public ResultModel handlerOrderOtherException(Exception e) {
return new ResultModel(false,"系统错误: " + e.getMessage());
}
}
下面使我们的测试方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXRGrLE7-1592134456795)(https://s1.ax1x.com/2020/06/14/tzOSO0.png)]
下面我们来探究下原理,按照我们上面所猜测的
-首先看下,ControllerAdvice这个注解:
如下:
-
- @link Component @Component
-
- @link ExceptionHandler @ExceptionHandler
-
- @link InitBinder @InitBinder
-
- @link ModelAttribute @ModelAttribute
由这三个注解组成,这三个注解有什么功能呢?预知后事如何~请看下回分解