Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java .exception()是否会捕获嵌套未来中抛出的异常?或者放在正确的位置。例外()_Java_Exception_Java 8_Future_Completable Future - Fatal编程技术网

Java .exception()是否会捕获嵌套未来中抛出的异常?或者放在正确的位置。例外()

Java .exception()是否会捕获嵌套未来中抛出的异常?或者放在正确的位置。例外(),java,exception,java-8,future,completable-future,Java,Exception,Java 8,Future,Completable Future,这是否也会捕获嵌套条中抛出的异常。然后编写lambda?或者我需要写下这个: foo.thenCompose(fooResponse -> { ... return bar.thenCompose(barResponse -> { ... }); }).exceptionally(e -> { ... }); 然后重试?是的,通过“例外”方法,您可以处理嵌套的CompletableFuture 第一个示例将运行是的,通过“例外”方法,您可以处理嵌套的C

这是否也会捕获嵌套条中抛出的异常。然后编写lambda?或者我需要写下这个:

foo.thenCompose(fooResponse -> {
  ...
  return bar.thenCompose(barResponse -> {
    ...
  });
}).exceptionally(e -> {
  ...
});

然后重试?

是的,通过“例外”方法,您可以处理嵌套的CompletableFuture
第一个示例将运行

是的,通过“例外”方法,您可以处理嵌套的CompletableFuture 第一个示例将起作用

最后一个单独的异常值足以用一个替代的普通结果值替换任何可丢弃的值,至少对于它返回的结果阶段是如此,但值得清理导致这个问题的思维定势

Exceptive不捕获任何异常,也没有嵌套的未来。重要的是要理解,由创建一个新的完成阶段定义的所有方法,其完成将受到特定方法契约的影响,但决不会影响完成阶段,因为该方法已在上被调用

因此,当您使用Exceptive时,会涉及两个期货,一个是您在Exceptive上调用的期货,另一个是Exceptive返回的新期货。合同规定,在正常完工的情况下,后者将以与前者相同的价值完工,但如果前者是例外完工,则以功能评估的结果完工

所以当你执行

foo.thenCompose(fooResponse -> {
  ...
  return bar.thenCompose(barResponse -> {
    ...
  }).exceptionally(nestedE -> {
    ...
  });
}).exceptionally(e -> {
  ...
});
表明无论第二阶段发生了什么,第一阶段总是反映了我们显式完成的结果。所以Exceptive不会捕获异常,前一个阶段的异常完成永远不会改变,它所做的只是定义一个新阶段的完成

因此,如果stage1是stage0.thenComposex->someOtherStage调用的结果,那么stage1和stage2之间的关系就无关紧要了。重要的是完成第一阶段

如果stage0异常完成,它将尝试异常完成stage1 如果stage0使用一个值完成,并且函数抛出一个异常,那么它将尝试异常地完成stage1 如果stage0使用一个值完成,并且函数返回一个已异常完成或将异常完成的stage,它将尝试异常完成stage1 如果stage0使用一个值完成,并且函数返回一个stage someOtherStage,该stage已经或将使用一个值完成,它将尝试使用该值完成stage1 请注意,没有嵌套,其他阶段可能是新构建的或已经存在的阶段,也可能在其他地方使用。因为链接总是构造新的阶段,而不会影响现有的阶段,所以这些其他地方不会受到这里发生的任何事情的影响

进一步注意术语“尝试完成”,因为我们仍然可以在尝试之前调用complete、CompleteException或cancel。对于阶段2来说,完成的方式并不重要,重要的是结果

因此,如果任何一个案件的企图从1。到3.,若要异常完成阶段1,请成功,将尝试完成阶段2,并将函数的结果传递给异常。在案例4中,如果尝试使用值完成stage1成功,则将尝试使用该值完成stage2

如果我们使用

for(int run = 0; run < 4; run++) {
    CompletableFuture<String> stage1 = new CompletableFuture<>();
    CompletableFuture<String> stage2 = stage1.exceptionally(t -> "alternative result");

    if(run > 1) stage2.cancel(false);

    if((run&1) == 0) stage1.complete("ordinary result");
    else stage1.completeExceptionally(new IllegalStateException("some failure"));

    stage1.whenComplete((v,t) ->
        System.out.println("stage1: "+(t!=null? "failure "+t: "value "+v)));
    stage2.whenComplete((v,t) ->
        System.out.println("stage2: "+(t!=null? "failure "+t: "value "+v)));
    System.out.println();
}
它将打印第3阶段:价值替代结果,因为第2阶段已异常完成,完成的历史完全无关。第1阶段:完成一般结果;语句将导致函数的求值返回一个新的CompletableFuture,它将永远不会完成,因此不会对结果产生影响。如果我们省略这一行,stage1将永远不会完成,函数也永远不会被计算,因此,将永远不会创建“嵌套”stage,但是正如所说的,这个历史对stage2并不重要

因此,如果您上次调用的链接完成阶段是一个Exceptionally函数,那么它将返回一个新阶段,该阶段将始终使用一个值完成,该值来自前一阶段或从函数返回,而不管前面的依赖关系图如何。除非函数本身抛出异常或有人对其调用一个显式完成方法,如cancel。

最后一个异常足以用一个可选的普通结果值替换任何throwable,至少对于它返回的结果阶段是如此,但有必要清理导致这个问题的思维定势

Exceptive不捕获任何异常,也没有嵌套的未来。重要的是要理解,由定义的所有方法都会创建一个新的完成阶段,其完成将受到参与者合同的影响 方法,但决不影响完成阶段,该方法已在上调用

因此,当您使用Exceptive时,会涉及两个期货,一个是您在Exceptive上调用的期货,另一个是Exceptive返回的新期货。合同规定,在正常完工的情况下,后者将以与前者相同的价值完工,但如果前者是例外完工,则以功能评估的结果完工

所以当你执行

foo.thenCompose(fooResponse -> {
  ...
  return bar.thenCompose(barResponse -> {
    ...
  }).exceptionally(nestedE -> {
    ...
  });
}).exceptionally(e -> {
  ...
});
表明无论第二阶段发生了什么,第一阶段总是反映了我们显式完成的结果。所以Exceptive不会捕获异常,前一个阶段的异常完成永远不会改变,它所做的只是定义一个新阶段的完成

因此,如果stage1是stage0.thenComposex->someOtherStage调用的结果,那么stage1和stage2之间的关系就无关紧要了。重要的是完成第一阶段

如果stage0异常完成,它将尝试异常完成stage1 如果stage0使用一个值完成,并且函数抛出一个异常,那么它将尝试异常地完成stage1 如果stage0使用一个值完成,并且函数返回一个已异常完成或将异常完成的stage,它将尝试异常完成stage1 如果stage0使用一个值完成,并且函数返回一个stage someOtherStage,该stage已经或将使用一个值完成,它将尝试使用该值完成stage1 请注意,没有嵌套,其他阶段可能是新构建的或已经存在的阶段,也可能在其他地方使用。因为链接总是构造新的阶段,而不会影响现有的阶段,所以这些其他地方不会受到这里发生的任何事情的影响

进一步注意术语“尝试完成”,因为我们仍然可以在尝试之前调用complete、CompleteException或cancel。对于阶段2来说,完成的方式并不重要,重要的是结果

因此,如果任何一个案件的企图从1。到3.,若要异常完成阶段1,请成功,将尝试完成阶段2,并将函数的结果传递给异常。在案例4中,如果尝试使用值完成stage1成功,则将尝试使用该值完成stage2

如果我们使用

for(int run = 0; run < 4; run++) {
    CompletableFuture<String> stage1 = new CompletableFuture<>();
    CompletableFuture<String> stage2 = stage1.exceptionally(t -> "alternative result");

    if(run > 1) stage2.cancel(false);

    if((run&1) == 0) stage1.complete("ordinary result");
    else stage1.completeExceptionally(new IllegalStateException("some failure"));

    stage1.whenComplete((v,t) ->
        System.out.println("stage1: "+(t!=null? "failure "+t: "value "+v)));
    stage2.whenComplete((v,t) ->
        System.out.println("stage2: "+(t!=null? "failure "+t: "value "+v)));
    System.out.println();
}
它将打印第3阶段:价值替代结果,因为第2阶段已异常完成,完成的历史完全无关。第1阶段:完成一般结果;语句将导致函数的求值返回一个新的CompletableFuture,它将永远不会完成,因此不会对结果产生影响。如果我们省略这一行,stage1将永远不会完成,函数也永远不会被计算,因此,将永远不会创建“嵌套”stage,但是正如所说的,这个历史对stage2并不重要


因此,如果您上次调用的链接完成阶段是一个Exceptionally函数,那么它将返回一个新阶段,该阶段将始终使用一个值完成,该值来自前一阶段或从函数返回,而不管前面的依赖关系图如何。除非函数本身抛出异常或有人对其调用一个显式完成方法,如cancel。

您尝试过吗?@JacobG.-是的,我的同事是。一旦我们发现了,就抛出一个问题来自我回答。按照我的措辞,我找不到一个问题来回答这个问题。不管怎样,也许这里有人能提供更多的见解。明白了。如果还没有回答,我会在几个小时内打一枪。所以答案是肯定的,它抓住了它。但是,我的直觉是说,从语法上来说,似乎每一个.thenApply,.thenampose等的链都应该以自己的.exceptive结束。陛下是不是因为嵌套调用返回的是一个future,它被链接到其余的外部调用,实际上它只是一个future链?也许这就是我缺少的直觉。你试过了吗?@JacobG。-是的,我的同事是。一旦我们发现了,就抛出一个问题来自我回答。按照我的措辞,我找不到一个问题来回答这个问题。不管怎样,也许这里有人能提供更多的见解。明白了。如果还没有回答,我会在几个小时内打一枪。所以答案是肯定的,它抓住了它。但是,我的直觉是说,从语法上来说,似乎每一个.thenApply,.thenampose等的链都应该以自己的.exceptive结束。陛下是不是因为嵌套调用返回的是一个future,它被链接到其余的外部调用,实际上它只是一个future链?也许这就是我失去的直觉。嘿,非常感谢你。这是
这对我重新理解很有帮助。嘿,非常感谢你。这对我重新认识很有帮助。