我有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;
});
我可以把我的最终逻辑放在哪里?
答案 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;
});