一次@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

相关文章
|
10月前
|
Java 编译器 程序员
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
|
5天前
|
Cloud Native 数据处理
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
|
3月前
|
前端开发 程序员
项目中异常是如何处理的
项目中设定了全局异常处理器,统一处理预期和运行时异常。预期异常由程序员手动抛出,用于异常情况的接口返回;运行时异常为不可控错误,提供统一返回格式便于前端提示和后端排查。全局异常处理器借助@RestControllerAdvice和@ExceptionHandler注解,前者标识处理器,后者按异常类型定制前端响应,如预期异常直接返回,运行时异常则调整响应内容。
51 0
VS2017诊断工具意外失败处理方法
VS2017诊断工具意外失败处理方法
VS2017诊断工具意外失败处理方法
|
10月前
|
前端开发
一个 ExpressionChangedAfterItHasBeenCheckedError 错误的解决过程
一个 ExpressionChangedAfterItHasBeenCheckedError 错误的解决过程
|
12月前
|
存储 监控 数据可视化
01.崩溃捕获设计实践方案
01.崩溃捕获设计实践方案
163 3
|
Java 数据库连接
异常处理一:抓抛模型
异常处理一:抓抛模型
59 0
|
缓存 前端开发 JavaScript
别被骗了,try-catch语句真的会影响性能吗?
别被骗了,try-catch语句真的会影响性能吗?
别被骗了,try-catch语句真的会影响性能吗?
|
测试技术
软件测试面试题:当一个接口出现异常时候,你是如何分析异常的?
软件测试面试题:当一个接口出现异常时候,你是如何分析异常的?
258 0
|
Java Spring
另一个角度看『异常』
另一个角度看『异常』
另一个角度看『异常』