公司项目改BUG:子线程异常信息无法传递到主线程

博客讲述了在多线程环境下,如何处理子线程异常并将其传递给主线程。当子线程抛出异常时,JVM默认处理不会传递给主线程。解决方案包括使用Callable接口的call方法捕获异常,设置未捕获异常处理器,通过共享变量或队列进行线程间通信,确保主线程能够获取并处理子线程的异常信息。
摘要由CSDN通过智能技术生成

文章目录

问题出现

简单逻辑描述:
用户下载模板上传的excel文件,然后填写后导入服务器,其中有一些字段有填写要求(例如A中填写1,则B只能填写1)。用户将excel文件导入服务器的时候,服务器基于多线程进行校验,如果校验失败则会抛出业务异常。然后将异常信息发给前台,进行提示。

现在问题是,线程抛出异常后没有被主线程拿到,而是直接被JVM处理了(在服务器终端打印堆栈信息)

我要做的就是,让主线程拿到子线程的异常信息,然后返回给前台

问题解决

以上这个问题如果复习过线程、线程池相关的资料,一眼就能能看出来,这是一个“子线程异常传递”的问题。
幸好之前总结过这类问题,没想到居然在公司改BUG的时候用到了

【1】给线程布置任务有两个接口,一个是runnable(对应run方法),另一个是callable(对应call方法),前者声明的时候没有抛出异常(throws Exception),而后者声明了异常。
通过这次改BUG最直观的感受就是:
run方法中,如果遇到编译期异常(例如IOException)一定要在run方法内部完成处理,不能够向上抛出。

                                if(isMatch){
   
                                    throw new IOException("导入数据不符合规范");
                                }

而要该的代码中,抛出的就是一个受检异常。

虽然run方法的checked exception必须处理,但是runtime exception是可以抛出的,那么我是不是可以把IO exception的message取出来,重新包装为一个runtimeException。

        catch (InvocationTargetException e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值