gpt4 book ai didi

java - 为什么方法在异步嵌套异常堆栈跟踪中不会出现两次?

转载 作者:行者123 更新时间:2023-11-30 05:24:47 32 4
gpt4 key购买 nike

我使用下面的示例代码,其中 CompletableFuture 被链接多次,我想知道为什么当异常发生时,链接代码不会在堆栈跟踪中多次出现抛出。

package com.yannick;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;

public class AsyncExceptionNestingTestMain {
public static void main(String[] args) throws Exception {
CompletableFuture<String> failingCF = createFailingCF();
CompletableFuture<String> chained = chainAndNestException(failingCF);
CompletableFuture<String> chained2 = chainAndNestException(chained);
chained2.get();
}

private static CompletableFuture<String> chainAndNestException(CompletableFuture<String> toChain) {
return toChain.handleAsync((result, exception) -> {
if (exception != null)
throw new CompletionException(exception);
return result;
});
}

private static CompletableFuture<String> createFailingCF() {
return CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Failed!");
});
}
}

异常(exception)情况如下:

Exception in thread "main" java.util.concurrent.ExecutionException: java.util.concurrent.CompletionException: java.util.concurrent.CompletionException: java.lang.RuntimeException: Failed!
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at com.yannick.AsyncExceptionNestingTestMain.main(AsyncExceptionNestingTestMain.java:11)
Caused by: java.util.concurrent.CompletionException: java.util.concurrent.CompletionException: java.lang.RuntimeException: Failed!
// here is the only occurence of the chaining method:
at com.yannick.AsyncExceptionNestingTestMain.lambda$chainAndNestException$0(AsyncExceptionNestingTestMain.java:17)
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:822)
at java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:797)
at java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:443)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.util.concurrent.CompletionException: java.lang.RuntimeException: Failed!
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592)
at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
... 4 more
Caused by: java.lang.RuntimeException: Failed!
at com.yannick.AsyncExceptionNestingTestMain.lambda$createFailingCF$1(AsyncExceptionNestingTestMain.java:24)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
... 5 more

最佳答案

CompletionException 由reportGet 中的CompletableFuture 作为特殊类型的异常处理:

        if ((x instanceof CompletionException) && (cause = x.getCause()) != null)
x = cause;

因此,当您在代码中抛出 CompletionException 时,只会报告其原因。如果替换,您可以看到链式异常:

    throw new CompletionException(exception);

通过(例如):

    throw new RuntimeException(exception);

关于java - 为什么方法在异步嵌套异常堆栈跟踪中不会出现两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58876228/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com