一次@HandlerException 没有捕获预期异常经历

简介: 基于@ControllerAdvice 进行全局异常处理,异常无法捕获情况

问题

存在一个多线程方法(基于spring @async),方法内部逻辑异常会throw new 自定义异常,有相应的exceptionhandler,但是每一次都不走这个handler,而是走兜底的Exception.class handler。当删除Exception.class 的Handler能够达到预期。

解决

通过debug发现当抛出异常的时候抛出的是ExecutionException异常,故查相应资料异步task执行过程中抛出异常的处理情况。jvm的设计原则线程是独立执行的代码片段,代码中的问题应该有线程自己处理,而不是委托到外部。

所以我们是无法捕获到线程中的异常的。

最终由jvm调用UncaughtExceptionHandler来处理未捕获异常。

通常可以设置线程的自定义的UncaughtExceptionHandler来处理此类异常。

execute() 和submit()

execute() 位于Executor顶层接口,而submit存在ExecutorService。execute的入参是基础的没有返回值的runnable接口实现,同时execute()返回时void。

submit()入参增加了callable实现,同时submit返回future还可以抛出线程中的异常,但是这个异常会被ExecutionException包装,因为异常也作为一种返回状态,这也就是这次的原因。

解决方案

增加ExecutionException异常的handler,但是无法获取errorcode

相关文章
|
Java 编译器 程序员
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
|
4月前
|
Cloud Native 数据处理
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
|
7月前
|
前端开发 程序员
项目中异常是如何处理的
项目中设定了全局异常处理器,统一处理预期和运行时异常。预期异常由程序员手动抛出,用于异常情况的接口返回;运行时异常为不可控错误,提供统一返回格式便于前端提示和后端排查。全局异常处理器借助@RestControllerAdvice和@ExceptionHandler注解,前者标识处理器,后者按异常类型定制前端响应,如预期异常直接返回,运行时异常则调整响应内容。
100 0
|
存储 监控 数据可视化
01.崩溃捕获设计实践方案
01.崩溃捕获设计实践方案
191 3
|
C语言 C++
【C++】异常的使用和细节
【C++】异常的使用和细节
71 0
|
前端开发
前端工作小结52-错误的处理方式
前端工作小结52-错误的处理方式
93 0
前端工作小结52-错误的处理方式
|
JSON Java 程序员
写了这么久的业务连异常都不知道怎么处理吗
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
220 0
GoogleGuava - 第 1 章 基本工具——Throwables:简化异常和错误的传播与检查
GoogleGuava - 第 1 章 基本工具——Throwables:简化异常和错误的传播与检查
155 0
GoogleGuava - 第 1 章 基本工具——Throwables:简化异常和错误的传播与检查
|
Java Spring
另一个角度看『异常』
另一个角度看『异常』
另一个角度看『异常』
|
监控 前端开发 Java
为什么你写的代码有时候和预期不一致
为什么你写的代码有时候和预期不一致
1462 0