有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

异步使用Java `完全未来。例外情况`有选择地在例外情况下继续

我使用Java CompletableFutures将一系列异步任务链接在一起。代码如下所示:

CompletableFuture<Result> doTasks(final TaskId id) {
    return firstTask.workAsync(id)
            .thenComposeAsync(__ -> secondTask.workAsync(id))
            .thenComposeAsync(__ -> thirdTask.workAsync(id))
            .thenApplyAsync(__ -> fourthTask.workAsync(id));
}

然而,firstTask.workAsync抛出一个异常,表明工作已经完成,这在这种情况下是可以的,所以我想忽略它,继续整个链

当然,我可以将该位封装在一个单独的函数中,在这个函数中我可以处理异常,但是有没有办法直接在CompletableFuture链中处理它,并继续抛出所有其他异常

一位同事建议我使用CompletableFuture.exceptionally,但我在网上看到的所有示例都是完全无用的,只返回null,这似乎会破坏链。在这种情况下我该如何使用它


共 (1) 个答案

  1. # 1 楼答案

    exceptionally函数中返回null本身不会杀死链。它杀死链的唯一方法是在下游函数中缺少null处理,并导致NullPointerException

    可以将exceptionally函数设置为处理某些类型的异常,而不是其他类型的异常。例如:

    return firstTask.workAsync(id)
            .thenComposeAsync(firstResult -> secondTask.workAsync(id))
            .exceptionally(t -> {
                               if (t instanceof TransientException) {
                                   return getUsingBackupMethod(id);
                               }
                               throw new RuntimeException(t);
                           });
    

    这个exceptionally函数将(有效地)捕获前两个任务中任何一个引发的异常