这个问题特定于 Java 和CompletableFuture
.
如果我有像下面这样的异步方法,
CompletableFuture<String> get() {
/* Step #1: Do some sync prep work */
String s = doSomethingSync();
/* Step #2: Do something async (returning CompletableFuture) */
return doSomethingAsync(s);
}
如果第 1 步中的代码抛出异常,调用者get()
会在它返回之前得到一个异常CompletableFuture
,而如果CompletableFuture
第 2 步中返回的代码抛出,调用者只会在与返回的CompletableFuture
.
这表明调用者get()
应该编写一些复杂的异常处理代码来处理这两种情况。
这是另一个异步方法的示例invokeGet()
,它调用get()
并返回它返回的长度String
:
CompletableFutre<Integer> InvokeGet() {
try {
CompletableFuture future = get();
return furure.handle((result, throwable) -> {
if (throwable != null) {
/* Handle exception thrown in step #2 in get(), e.g. rethrow */
} else {
return result.length();
}
});
} catch (Exception e) {
/* Handle exception thrown in step #1 in get() */
/* Return some value or throw */
}
}
我的问题是:
写得不好是get()
因为它要求调用者进行这种复杂的异常处理,还是这是一种常见的模式?如果发生错误,返回 s 的异步方法是否应该CompletableFuture
限制自己返回错误的期货,这样它们的调用者就不必编写这样的错误处理代码?