最终在CompletableFuture中阻止等效的异常处理

时间:2019-01-26 09:17:02

标签: java-8 completable-future

我有CompletableFuture,可以返回结果或异常。我想执行一些常见的代码,以防出现异常和正常结果。类似于try catch finally

当前实施

CompletableFuture<Integer> future= CompletableFuture.supplyAsync(this::findAccountNumber)
                             .thenApply(this::calculateBalance)                      
                             .thenApply(this::notifyBalance)
                             .exceptionally(ex -> {
                                 //My Exception Handling logic 
                                 return 0;
                             });

我可以把我的最终逻辑放在哪里?

2 个答案:

答案 0 :(得分:1)

最接近"y"的是whenComplete。像directory一样,它接受一个接收结果值或throwable的函数,但不提供替换结果值,而是新的完成阶段不会像{{1 }}。

所以

finally

等同于

handle

因此,当与

一起使用时
finally

第一版印刷品

static int decode(String s) {
    try {
        return Integer.parseInt(s);
    }
    finally {
        System.out.println("finally action");
    }
}

和后者的照片

static int decode1(String s) {
    return CompletableFuture.completedFuture(s)
        .thenApply(Integer::parseInt)
        .whenComplete((i,t) -> System.out.println("finally action"))
        .join();
}

这两者的共同点是,如果try块/前一阶段异常完成,则在finally动作中引发的异常将取代原始结果,并掩盖该异常。

答案 1 :(得分:0)

handle()方法提供了更灵活的方法。它需要一个接收正确结果或异常的函数:

来自Java文档

handle(BiFunction<? super T,Throwable,? extends U> fn)
  

返回一个新的CompletionStage,该阶段完成时,   通常或例外情况下,将使用此阶段的结果执行   异常作为提供函数的参数。

CompletableFuture<Integer> thenApply = CompletableFuture.supplyAsync(this::findAccountNumber)
                         .thenApply(this::calculateBalance)                      
                         .thenApply(this::notifyBalance)        
                         .handle((ok, ex) -> {
                            System.out.println("Code That we want to run in finally ");
                            if (ok != null) {
                                    System.out.println("No Exception !!");
                            } else {

                                System.out.println("Got Exception " + ex.getMessage());
                                return -1;
                            }
                            return ok;
                        });