我遇到了Java 8 CompletableFuture.exceptionally方法的奇怪行为。如果我执行此代码,它可以正常工作并打印java.lang.RuntimeException
CompletableFuture<String> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException());
future.exceptionally(e -> {
System.out.println(e.getClass());
return null;
});
但是,如果我在将来的处理中添加另一个步骤,例如
thenApply
,则异常类型将更改为java.util.concurrent.CompletionException
,而原始异常将包含在其中。CompletableFuture<String> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException());
future.thenApply(v-> v).exceptionally(e -> {
System.out.println(e);
return null;
});
有什么理由要发生这种情况吗?我认为这很令人惊讶。
最佳答案
此行为is specified in the class documentation of CompletionStage
(fourth bullet):
如果您考虑要知道是否在失败的阶段调用了exceptionally
或它的直接或间接先决条件之一,也就不足为奇了。
关于exception - Java 8 CompletableFuture的异常行为异常方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27430255/