当前位置:网站首页>多个全局异常处理类,怎么规定执行顺序
多个全局异常处理类,怎么规定执行顺序
2022-07-03 06:50:00 【绅士jiejie】
背景
项目中,我们一般都会定义一个全局异常处理类来统一处理异常,规范代码的同时也提高了开发效率,有了全局异常处理类,除非特殊情况,大多数时候,我们只需要把异常往外抛即可,后续会由异常处理类来统一打上日志,封装异常信息到统一响应对象中再返回。
但是有时候,大的项目,都会封装不同的基础项目依赖,把一些常用的,通用的功能封装到不同的项目中,然后其余项目通过引入依赖的方式,来使用这些功能,这样可以保证相关项目的统一规范性,以及后续更易扩展这些通用功能,其实也是一种抽象的思想,那如果基础依赖中就有全局异常处理类了,项目引入了这个基础依赖,启动时就会注入这个全局异常处理类,但是这个全局异常处理类又不是能满足个别项目的特殊话异常处理,比如它没有对sql异常,参数校验异常做特殊处理,就会导致这些异常最后被兜底的异常捕获处理,输出的响应结果可能不是我们想要的,那这时,我们就需要在自己的项目中定义项目所需的全局异常处理类了。
为什么要规定执行顺序
假设此时我们在项目中也定义了一个全局异常处理类,此时项目启动时,就会注入两个全局异常处理类,而spring处理异常的逻辑很直接,就是按照顺序遍历全局异常处理器列表,如果这个异常处理器能够处理该异常,后续的异常处理器就不会再处理该异常了,所以如果基础的异常处理器是在列表前列,而我们定义的特殊异常处理器在基础异常处理器的后面,那我们抛出的特定异常,依旧不会被特定处理器处理,得到的响应结果还是由基础异常处理器封装的响应信息。因此规定全局异常处理类的执行顺序很重要。
怎么规定执行顺序?
通过 @Order() 注解,注解在全局异常处理类上,顺序越小,越早注入,我们只需要保证 @Order() 的值比基础的全局异常处理类更小即可,就可以控制全局异常处理器列表的顺序了。
提供一个排查和确认方式
如果用了 @Order() 注解还没有实现需求,那么就先进入 DispatcherServlet.class ->进入该类中的 processDispatchResult() 方法->进入该方法中的 processHandlerException() 方法,没错,这个 processHandlerException() 方法就是处理异常的方法。
截取部分 processHandlerException() 方法中的代码,我们断点可以打在这:
通过查看HandlerExceptionResolver类中的exceptionHandlerAdviceCache属性,我们就可以查看到全局异常处理器列表了,这个属性大致结构是这样的:
private final Map<ControllerAdviceBean, ExceptionHandlerMethodResolver> exceptionHandlerAdviceCache = new LinkedHashMap();
可以发现全局异常处理器列表是通过LinkedHashMap来维护的,所以我们可以通过看全局异常处理器在LinkedHashMap中的排序,就能够知道我们自己定义的全局异常处理器是否成功的排序在了基础全局异常处理器前了。
边栏推荐
- What are the characteristics and functions of the scientific thinking mode of mechanical view and system view
- Local rviz call and display of remote rostopic
- Judge whether the date time exceeds 31 days
- Pytorch exercise items
- 卡特兰数(Catalan)的应用场景
- [untitled] 8 simplified address book
- Jenkins
- SSH link remote server and local display of remote graphical interface
- Yolov3 learning notes
- Unit test notes
猜你喜欢
论文笔记 VSALM 文献综述《A Comprehensive Survey of Visual SLAM Algorithms》
Read blog type data from mysql, Chinese garbled code - solved
2022 - 06 - 23 vgmp - OSPF - Inter - Domain Security Policy - nat Policy (Update)
Winter vacation work of software engineering practice
Golang operation redis: write and read kV data
Pytest -- write and manage test cases
卡特兰数(Catalan)的应用场景
Scripy learning
IC_EDA_ALL虚拟机(丰富版):questasim、vivado、vcs、verdi、dc、pt、spyglass、icc2、synplify、INCISIVE、IC617、MMSIM、工艺库
Push box games C #
随机推荐
Pytorch exercise items
What are the characteristics and functions of the scientific thinking mode of mechanical view and system view
New knowledge! The virtual machine network card causes your DNS resolution to slow down
[untitled]
A letter to graduating college students
【类和对象】深入浅出类和对象
2022 cisp-pte (III) command execution
Use @data in Lombok to simplify entity class code
利用C#实现Pdf转图片
UTC time, GMT time, CST time
MySQL installation
The difference between CONDA and pip
Learning notes -- principles and comparison of k-d tree and IKD tree
opencv
10000小时定律不会让你成为编程大师,但至少是个好的起点
Heap sort and priority queue
Winter vacation work of software engineering practice
方差迭代公式推导
2022 CISP-PTE(三)命令执行
IC_ EDA_ All virtual machine (rich Edition): questasim, vivado, VCs, Verdi, DC, Pt, spyglass, icc2, synthesize, innovative, ic617, mmsim, process library