Java 8 CompletableFuture的异常行为异常方法

卢卡斯

我遇到了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;
});

有什么理由要发生这种情况吗?我认为这很令人惊讶。

霍尔格

CompletionStage(第四个项目符号)的类文档中指定了此行为

方法handle还允许该阶段计算替换结果,该替换结果可以实现其他从属阶段的进一步处理。在所有其他情况下,如果阶段的计算由于(未经检查的)异常或错误而突然终止,那么所有需要完成该阶段的从属阶段也会异常结束,并且CompletionException将异常作为其原因。

如果您认为自己知道是exceptionally在失败的阶段调用的,还是它的直接或间接先决条件之一,也就不足为奇了

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章