我有以下代码:
// How to throw the ServerException?
public void myFunc() throws ServerException{
// Some code
CompletableFuture<A> a = CompletableFuture.supplyAsync(() -> {
try {
return someObj.someFunc();
} catch(ServerException ex) {
// throw ex; gives an error here.
}
}));
// Some code
}
someFunc()
抛出一个 ServerException
。我不想在这里处理这个,而是将异常从 someFunc()
myFunc()
调用者。
原文由 ayushgp 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的代码表明您稍后将在同一方法中使用异步操作的结果,因此您必须处理
CompletionException
无论如何,一种处理方法是All exceptions thrown inside the asynchronous processing of the
Supplier
will get wrapped into aCompletionException
when callingjoin
, except theServerException
we have already包裹在CompletionException
中。当我们重新抛出
CompletionException
的原因时,我们可能会面临未经检查的异常,即ServerException
Error
或RuntimeException
ff3f 的子类---
。上面的代码使用 multi-catch 处理所有这些,这将重新抛出它们。由于getCause()
声明的返回类型是Throwable
,编译器要求我们处理该类型,尽管我们已经处理了所有可能的类型。直接的解决方案是将这个实际上不可能的 throwable 包裹在AssertionError
中。或者,我们可以为自定义异常使用替代结果 future:
该解决方案将以其包装形式重新抛出所有“意外”throwables,但仅以通过
exception
未来传递的原始形式抛出自定义ServerException
。请注意,我们必须确保a
已完成(例如首先调用join()
),然后再查询exception
条件-