java-8 - finally 块等效于 CompletableFuture 中的异常处理
问题描述
我有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;
});
我可以把我的最终逻辑放在哪里?
解决方案
最接近的等价物finally
是whenComplete
。像 一样handle
,它接受一个函数,接收结果值或 throwable,但它不提供替换结果值,而是新的完成阶段不会改变结果,就像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();
}
所以当使用 with
for(String s: Arrays.asList("1234", "foo bar")) try {
System.out.println("decoded: "+decode(s));
} catch(Exception ex) {
System.out.println("decoding "+s+" failed with "+ex);
}
第一个变体打印
finally action
decoded: 1234
finally action
decoding foo bar failed with java.lang.NumberFormatException: For input string: "foo bar"
和后者打印
finally action
decoded: 1234
finally action
decoding foo bar failed with java.util.concurrent.CompletionException: java.lang.NumberFormatException: For input string: "foo bar"
两者的共同点是,如果 try 块/前一个阶段异常完成,则 finally 操作中引发的异常将取代原始结果,从而隐藏异常。
推荐阅读
- c - 如何扫描字符串和整数的用户输入以放入c中的二维数组
- c# - 我应该将 dotnet-tools .config 目录检查到源代码管理中吗?
- xslt - XSLT 分组/合并 - 两个不同的节点合二为一
- angular - 在 Spring Boot 中使用 @RequestBody 处理 MultipartFile
- react-native - 在 OnPress 中调用两个函数会引发“重新渲染过多”错误
- c# - 如何实现位图的最小分配搜索?
- sql - 执行存储过程时遇到问题
- c# - 错误 550:使用 C# 从 ftp 服务器下载文件时,指定的网络名称不再可用
- reactjs - 请在组件上附加一个方法来实现共享
- python - 使用二维数组作为条件