通常在运行Future
并等待结果时,我只能抓住InterruptedException | ExecutionException
。
但是,如果任务抛出CustomException
我想要明确指出该怎么办?我可以做的比检查e.getCause() instanceof CustomException
吗?
List<Future> futures; //run some task
for (Future future : futures) {
try {
future.get(); //may throw CustomException
} catch (InterruptedException | ExecutionException e) {
if (e.getCause() instanceof CustomException) {
//how to catch directly?
}
}
}
答案 0 :(得分:3)
假设选中CustomException
,则无法进行此操作,因为该语言不允许您为不属于catch
签名的此类异常添加Future#get()
,因此永远不会被这种方法抛出(这是合同的一部分)。在您的代码中,注释 may throw CustomException
就在那里,因为您知道特定于此Future
的任务的实现。就get
接口的Future
方法而言,任何此类特定于实现的异常都将被包装为ExecutionException
的原因。
此外,使用e.getCause()
是检查ExecutionException
文档中明确提到的此类自定义异常的正确方法:
尝试检索因抛出异常而中止的任务的结果时抛出异常。可以使用
getCause()
方法检查此异常。
答案 1 :(得分:-1)
你可以捕获尽可能多的异常,但它应该是 在特定的顺序中,在分类异常之后必须有更广泛的例外。
例如:
catch (CustomException e) {
} catch (InterruptedException | ExecutionException e) {
}
// It could be even there if CustomException is not extended from InterruptedException | ExecutionException