问题
存在一个多线程方法(基于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