【发布时间】:2015-02-10 08:58:28
【问题描述】:
我遇到了 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;
});
有什么理由会发生这种情况吗?在我看来,这很令人惊讶。
【问题讨论】:
-
查看 stackoverflow.com/q/49230980/14731 了解何时包装(或不包装)异常的概述。
-
这是我发现的一篇文章,帮助我更好地理解了这个问题的解决方案 -> millross-consultants.com/…
-
@The0bserver,您添加的链接信息量很大,虽然不是全部,但我的很多疑问都清楚了:)
-
很高兴我能帮上忙@NIGAGA。
标签: exception java-8 completable-future