java - 如何抽象捕获异常 CompletableFutures 以调用方法
问题描述
好的,我有类似的方法
- CompletableFuture fetchCar(int id);
- CompletableFuture runSomething(Something t, Extra d);
- CompletableFuture 调用();
并且我想要一个可以使用的方法来执行以下操作,以便将任何同步异常转换为将来放置
private CompletableFuture<Void> invokeSomething(Something something) {
CompletableFuture<Void> future;
try {
future = something.runSomething(t, d);
} catch(Throwable e) {
future = new CompletableFuture<Void>();
future.completeExceptionally(e);
}
return future;
}
请注意,我只是碰巧选择了 #2 作为示例,但我想让它变得通用,这样我就可以停止输入它,因为通常它需要不时完成,以确保您处理同步和异步异常相同。
解决方案
我不确定这是你要找的,但你可以创建一个实用函数:
public static <T> CompletableFuture<T> foo(Callable<CompletableFuture<T>> callable) {
try {
return callable.call();
} catch (Exception ex) {
return CompletableFuture.failedFuture(ex);
}
}
然后你会像这样使用它:
Something something = ...;
CompletableFuture<Void> future = foo(() -> invokeSomthing(something));
一些注意事项:
- 使用
Callable
它是因为它的函数方法call
, 可以抛出Exception
. 如果使用类似的东西Supplier
,那么将它与可以抛出检查异常的方法一起使用会很混乱。 - 使用
catch (Exception ex)
而不是catch (Throwable ex)
因为Callable#call
不抛出Throwable
,通常认为捕获Error
s 是不好的做法。如果需要,您可以随时将其更改为Throwable
。 - 这个实用方法将返回一个失败的未来,由 NPE 引起,如果
callable
是null
; 不知道这是否需要。
推荐阅读
- string - 删除elisp中的括号
- light - Unity Issue Shadow Caster 2D
- c - 以不同方式处理最后一个参数的可变参数宏
- android - 带有选项卡布局的视图寻呼机超出屏幕范围
- node.js - Node.js 中的 Firebase Admin SDK 全局应用初始化
- python - 如何在熊猫中将浮点值转换为 date9 格式
- openflow - Openflow Floodlight:如何强制服务器在特定界面上运行?
- excel - 尝试从 XLA 文件中的 XLSX 电子表格获取信息
- vb.net - MySql.Data.MySqlClient 显示令人困惑的错误
- c# - 为什么我不能使用 Microsoft.AspNetCore.Mvc;在我的单元测试项目中?