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

相关文章
|
Linux Docker 容器
Docker 容器抓包说明
正常情况下,操作系统层面可以通过 tcpdump 来抓包。但对于容器环境,根据所使用的 base 镜像的不同,容器内不一定含有抓包工具,所以无法直接抓包。本文简要介绍如何通过 ```nsenter``` 工具来对容器快速抓包。 # nsenter 工具介绍 nsenter 包含在绝大部分 Linux 发行版预置的 util-linux 工具包中。它可以进入指定进程的关联命名空间。包
8727 0
|
11月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
12月前
|
Docker 容器
centos7.3之安装docker
centos7.3之安装docker
|
网络安全 开发工具 git
git修改提交路径以及强制提交——异常:error: remote origin already exists.与异常:error: failed to push some refs to的解决
git修改提交路径以及强制提交——异常:error: remote origin already exists.与异常:error: failed to push some refs to的解决
480 0
|
缓存 Java 微服务
Springboot微服务整合缓存的时候报循环依赖的错误 两种解决方案
Springboot微服务整合缓存的时候报循环依赖的错误 两种解决方案
260 1
|
SQL 算法 Java
(二十六)MySQL分库篇:Sharding-Sphere分库分表框架的保姆级教学!
前面《MySQL主从原理篇》、《MySQL主从实践篇》两章中聊明白了MySQL主备读写分离、多主多写热备等方案,但如果这些高可用架构依旧无法满足业务规模,或业务增长的需要,此时就需要考虑选用分库分表架构。
5168 4
|
缓存 安全 JavaScript
技术分享:探索POST请求为何会发送两次的奥秘
【8月更文挑战第20天】在Web开发过程中,遇到POST请求被意外发送两次的情况并不罕见。这一现象不仅影响用户体验,还可能对服务器造成不必要的负担。本文将从多个维度深入剖析POST请求为何会发送两次,并分享相应的解决方案,助力开发者在日常工作中有效应对此类问题。
571 0
|
前端开发 Java 开发者
每天一个摆脱if-else工程师的技巧,优雅的参数校验
在日常的开发工作中,为了程序的健壮性,大部分方法都需要进行入参数据校验。本文围绕作者如何优雅的进行参数校验展开讨论。
122557 9
|
JSON Java 数据格式
Springboot自定义全局异常处理
BasicErrorController是Spring Boot中默认提供的用于处理基本错误的控制器。它实现了ErrorController接口,用于处理在应用程序中发生的错误,例如404 Not Found等。此种方式是通过请求转发实现的,出现异常时,会转发到请求到/error,该接口对异常进行处理返回,是最符合全局异常处理的。
215 2
|
Java 测试技术 Spring
什么是循环依赖,如何解决?
在 Spring 应用中,循环依赖指的是两个或多个 Bean 之间相互引用,造成了一个环状的依赖关系。举例来说,如果 Bean A 依赖于 Bean B,同时 Bean B 也依赖于 Bean A,就形成了循环依赖。这种情况下,Spring 容器在创建这些 Bean 时会陷入无限循环,导致应用启动失败或者出现其他不可预测的问题。
640 1