当前位置:网站首页>多个全局异常处理类,怎么规定执行顺序
多个全局异常处理类,怎么规定执行顺序
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中的排序,就能够知道我们自己定义的全局异常处理器是否成功的排序在了基础全局异常处理器前了。
边栏推荐
- IC_ EDA_ All virtual machine (rich Edition): questasim, vivado, VCs, Verdi, DC, Pt, spyglass, icc2, synthesize, innovative, ic617, mmsim, process library
- “我为开源打榜狂”第一周榜单公布,160位开发者上榜
- ssh链接远程服务器 及 远程图形化界面的本地显示
- 服务器如何设置多界面和装IIS呢?甜甜给你解答!
- How to scan when Canon c3120l is a network shared printer
- [5g NR] UE registration process
- Read blog type data from mysql, Chinese garbled code - solved
- 保险公司怎么查高血压?
- Class and object summary
- La loi des 10 000 heures ne fait pas de vous un maître de programmation, mais au moins un bon point de départ
猜你喜欢

JMeter linked database

SQL implementation merges multiple rows of records into one row

Push box games C #

Yolov3 learning notes

Scroll view specifies the starting position of the scrolling element

10000小時定律不會讓你成為編程大師,但至少是個好的起點

利用C#实现Pdf转图片

10万奖金被瓜分,快来认识这位上榜者里的“乘风破浪的姐姐”

New knowledge! The virtual machine network card causes your DNS resolution to slow down

The pressure of large institutions in the bear market has doubled. Will the giant whales such as gray scale, tether and micro strategy become 'giant thunder'?
随机推荐
【开源项目推荐-ColugoMum】这群本科生基于国产深度学习框架PaddlePadddle开源了零售行业解决方案
利用C#实现Pdf转图片
Install VM tools
Page text acquisition
[Code] if (list! = null & list. Size() > 0) optimization, set empty judgment implementation method
Yolov3 learning notes
保险公司怎么查高血压?
How matlab modifies default settings
Yolov1 learning notes
The list of "I'm crazy about open source" was released in the first week, with 160 developers on the list
论文笔记 VSALM 文献综述《A Comprehensive Survey of Visual SLAM Algorithms》
Code management tools
Machine learning | simple but feature standardization methods that can improve the effect of the model (comparison and analysis of robustscaler, minmaxscaler, standardscaler)
UNI-APP中条件注释 实现跨段兼容、导航跳转 和 传参、组件创建使用和生命周期函数
Floating menu operation
[leetcode] day93 - intersection of two arrays II
Summary of UI module design and practical application of agent mode
Yolov2 learning and summary
Unit test framework + Test Suite
机器学习 | 简单但是能提升模型效果的特征标准化方法(RobustScaler、MinMaxScaler、StandardScaler 比较和解析)