异步使用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 楼答案
在
exceptionally
函数中返回null
本身不会杀死链。它杀死链的唯一方法是在下游函数中缺少null处理,并导致NullPointerException
可以将
exceptionally
函数设置为处理某些类型的异常,而不是其他类型的异常。例如:这个
exceptionally
函数将(有效地)捕获前两个任务中任何一个引发的异常