如何捕捉期货的自定义例外?

时间:2017-07-12 11:23:21

标签: java concurrent.futures

通常在运行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?
        }
    }
}

2 个答案:

答案 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