我正在尝试。exception和。handle,但这些似乎不起作用。在scala中,你可以用一个闭包在未来调用一个方法,就像一个finally块(它在异常和成功时运行),并且它按现状向链上传播异常或成功。
I tried this…
CompletableFuture<Object> future = newFuture.handle((r, e) -> {
if(r != null)
return r;
else if(e != null)
return e;
else
return new RuntimeException("Asdf");
});
Assert.assertTrue(future.isCompletedExceptionally());
但是这个测试失败了,因为未来完全成功了,结果是异常(多么奇怪)
使用CompletableFuture#whenComplete(BiConsumer)
。它的javadoc状态
返回一个新的
CompletionStage
,结果或异常与此阶段,在此阶段完成时执行给定的操作。当此阶段完成时,使用结果(如果没有则为
null
)和异常(如果没有则为null
)舞台作为论据。返回阶段完成时,动作的回报。如果提供的操作本身遇到异常,则返回的阶段异常完成,除非此阶段也异常完成。
换句话说,无论成功还是失败,它都将被调用,并且将传播初始future的状态(除非BiConsumer
抛出异常)。
CompletableFuture<String> future2 = newFuture.whenComplete((r, e) -> {
// consume the result
});
如果您需要转换结果(在您的示例中,您不需要),那么您可以使用handle
并自己传播内容。
哦,我想我明白了....像这样的东西似乎可以工作
CompletableFuture<Integer> future2 = newFuture.handle((r, e) -> {
//put finally like logic right here....
if(r != null)
return r;
else if(e != null)
throw new RuntimeException(e);
else
throw new RuntimeException("weird");
});