CompletableFuture.allOf,记录并重新抛出异常

时间:2018-07-12 12:09:59

标签: concurrency java-8

我有一组期货,每个期货都可能抛出一个异常,我想以自己的方式登录并重新抛出,但这无法编译:

 CompletableFuture<Void> lordOfFutures = CompletableFuture.allOf(future1, future3, future2)
            .handle((screen, throwable) -> {
            if (throwable!=null) {
                LOG.error(throwable, throwable);
                throw throwable;
            } else {
                return screen;
            });

是否可以记录发生的第一个异常并将其重新抛出?

1 个答案:

答案 0 :(得分:1)

handle期望其BiFunction<? super T,Throwable,? extends U>方法不允许抛出apply的{​​{1}}。这适用于Throwable包的所有功能。但是您根本不需要将可抛物扔回去:

java.util.function

CompletableFuture<Void> lordOfFutures = CompletableFuture.allOf(future1, future3, future2) .whenComplete((screen, throwable) -> { if (throwable!=null) { LOG.error(throwable, throwable); }); 返回的未来将具有与您调用它的未来相同的完成状态或值(但仅在执行指定的操作之后)。因此,如果whenComplete返回的未来异常完成,则“ allOf”也将完成,否则将以相同的值完成(此处始终为lordOfFutures)。