问题出现
简单逻辑描述:
用户下载模板上传的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