是否CompletionStage总是将异常包装在CompletionException中?

是否CompletionStage总是将异常包装在CompletionException中?,第1张

是否CompletionStage总是将异常包装在CompletionException中?

这些方法是否可能收到除以外的其他异常

CompletionException

是的,有可能,并且您不应该

CompletionException
未经
instanceof
检查(或检查使用情况)而投身到。

举个例子

CompletableFuture<Void> root = new CompletableFuture<>();root.whenComplete((v, t) -> {    System.out.println(t.getClass()); // class java.io.IOException});root.completeExceptionally(new IOException("blow it up"));

whenComplete
将收到
IOException
而不是
CompletionException
包装它。同样的行为适用于
exceptionally
handle


阶段的计算在Javadoc中定义:

由一个阶段执行的计算可被表达为一个

Function

Consumer
Runnable
根据(使用名称,包括应用,接受或运行,分别方法)是否需要参数和/或产生的结果。

我相信这句话

如果阶段的计算由于(未经检查的)异常或错误而突然终止

指的是其中的一个

Function#apply
Consumer#accept
Runnable#run
方法突然终止,因为一个的抛出的异常,而不是因为一个阶段格外通过一些其他机制完成。

另请注意,Javadoc说

该界面未定义用于初始创建,强制正常或 异常
强制完成,探查完成状态或结果或等待阶段完成的方法。的实现

CompletionStage
可以酌情提供实现这种效果的手段

换句话说,该接口允许实现在不突然终止任何计算的情况下出色地完成阶段。我认为这允许新的行为。


如果我们从以前扩展我的例子

CompletableFuture<Void> root = new CompletableFuture<>();CompletableFuture<Void> child = root.whenComplete((v, t) -> {    System.out.println(t.getClass()); // class java.io.Exception});child.whenComplete((v, t) -> {    System.out.println(t.getClass()); // class java.util.concurrent.CompletionException});root.completeExceptionally(new IOException("blow it up"));

您会注意到随附的完成文件会

child
收到
CompletionException
原始文件的包装
IOException
。从Javadoc来看,这对我来说并不明显

返回一个新的,

CompletionStage
具有与该阶段 相同的 结果或 异常

总而言之,似乎来自a的原始异常

completeExceptionally
被传递给直接的从属,而从属的从属却收到一个封闭的
CompletionException



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5428523.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存