- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
CompletionStage Javadoc 指出:
[...] if a stage's computation terminates abruptly with an (unchecked) exception or error, then all dependent stages requiring its completion complete exceptionally as well, with a CompletionException holding the exception as its cause.
既然异常完成总是将异常包装在CompletionException
中,为什么exceptionally()
、whenComplete()
和handle()
将异常表示为 Throwable
而不是 CompletionException
?
这很重要,因为它可以防止人们在这些方法内直接重新抛出异常。
这些方法是否有可能接收除 CompletionException
之外的异常?或者我可以安全地强制转换为这种类型吗?
(我在本地运行了一些测试,并深入研究了 CompletableFuture 源代码,乍一看,我看不出如何抛出任何其他类型的异常。)
最佳答案
Is it possible for these methods to receive an exception other than
CompletionException
?
是的,这是可能的,并且您不应该在没有 instanceof
检查(或检查您的使用情况)的情况下转换为 CompletionException
。
举这个例子
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
。同样的行为也适用于异常(exception)
和handle
。
阶段的计算在 Javadoc 中定义:
The computation performed by a stage may be expressed as a
Function
,Consumer
, orRunnable
(using methods with names including apply, accept, or run, respectively) depending on whether it requires arguments and/or produces results.
我相信这句话
if a stage's computation terminates abruptly with an (unchecked) exception or error
指的是由于 thrown exception 而突然终止的 Function#apply
、Consumer#accept
或 Runnable#run
方法之一,不是因为某个阶段通过某种其他机制异常完成。
另请注意,Javadoc 说
This interface does not define methods for initially creating, forcibly completing normally or exceptionally, probing completion status or results, or awaiting completion of a stage. Implementations of
CompletionStage
may provide means of achieving such effects, as appropriate
换句话讲,该接口(interface)允许实现异常地完成各个阶段,而不会突然终止任何计算。我认为这允许新的行为。
<小时/>如果我们扩展之前的示例
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
的完成会收到一个包含原始 IOException
的 CompletionException
。从 Javadoc 来看,这对我来说并不明显,它指出
Returns a new
CompletionStage
with the same result or exception as this stage
总而言之,来自 completeExceptionally
的原始异常似乎被传递给直接依赖项,而依赖项的依赖项则接收封闭的 CompletionException
。
关于java - CompletionStage 是否总是将异常包装在 CompletionException 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58582832/
我有一个 HttpClient 类,它有一个返回 CompletableFuture 的函数: public class HttpClient { public static Completabl
CompletionStage Javadoc 指出: [...] if a stage's computation terminates abruptly with an (unchecked) e
CompletionStage Javadoc 指出: [...] if a stage's computation terminates abruptly with an (unchecked) e
在不同的 java 次要版本下,我从相同的代码片段中得到了不同的输出。我在 open jdk bug tracker 上找不到相关的票证。 CompletableFuture completableF
这个问题在这里已经有了答案: Play Framework 2.5 JavaAsync throwing CompletionException (2 个答案) 关闭 5 年前。 在示例应用程序上从
我正在使用 Play 2.5 构建一个简单的应用程序。为了获得更好的性能,我将 Akka 分块响应与 Java 8 CompletionStage 策略结合使用。下面是生成分块响应的代码(不使用 Co
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在编写一个递归代码,根据像素值相似度来绘制对象轮廓。正如您在下面的代码中看到的,我正在使用四个异步工作的线程,但在运行时我收到以下发布的错误,我不知道如何修复它。 收到错误: Exception
我是一名优秀的程序员,十分优秀!