gpt4 book ai didi

java - 将可完成的 future 的异常映射到不同的异常类型?

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

我正在使用 Java 8 的可完成 future ,我希望能够接受 future 抛出的异常并将其转换为不同的异常。

一旦发生异常,我尝试过的所有复合 Material 似乎都会短路。

例如,使用 scala future,我可以做这样的事情:

scala.concurrent.Future<Object> translatedException = ask.recover(new Recover<Object>() {
@Override public Object recover(final Throwable failure) throws Throwable {
if (failure instanceof AskTimeoutException) {
throw new ApiException(failure);
}

throw failure;
}
}, actorSystem.dispatcher());

我希望能够在未来的 java 复合 block 中模仿它。这可能吗?

最佳答案

您可以使用 CompletableFuture#handle(BiFunction) .例如

CompletableFuture<String> ask = CompletableFuture.supplyAsync(() -> {
throw new IndexOutOfBoundsException();
});
CompletableFuture<String> translatedException = ask.handle((r, e) -> {
if (e != null) {
if (e instanceof IndexOutOfBoundsException) {
throw new IllegalArgumentException();
}
// fallback
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
}
throw new RuntimeException(e);
}
return r;
});

如果 ask 以异常完成,则 translatedException 将以潜在的转换异常完成。否则,它将具有相同的成功结果值。

关于我在代码中的评论,handle 方法需要一个 BiFunction,其 apply 方法未声明为抛出一个 Throwable 。因此,lambda 主体本身不能抛出一个 Throwable。参数 eThrowable 类型,所以你不能直接throw。如果您知道它是那种类型,您可以将它转换为 RuntimeException,或者您可以将它包装在 RuntimeException 中并throw

关于java - 将可完成的 future 的异常映射到不同的异常类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32514219/

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