Java 如何安全地打开CompletableException
我试图找出一种方法,在使用Java 如何安全地打开CompletableException,java,completable-future,Java,Completable Future,我试图找出一种方法,在使用CompletableFuture时,安全地处理调用CompletableFuture.join()时抛出的CompletionException 我正在寻找的行为是-如果异常的原因是任何未选中的异常,那么它应该按原样抛出。如果检查了原因,则将其包装为某种形式的RuntimeException(我在本例中使用了基本RuntimeException类,但在实际应用程序中,我会使用自定义派生类)并抛出包装异常 到目前为止,我已经提出了以下实用程序函数来执行展开: publi
CompletableFuture
时,安全地处理调用CompletableFuture.join()
时抛出的CompletionException
我正在寻找的行为是-如果异常的原因是任何未选中的异常,那么它应该按原样抛出。如果检查了原因,则将其包装为某种形式的RuntimeException
(我在本例中使用了基本RuntimeException
类,但在实际应用程序中,我会使用自定义派生类)并抛出包装异常
到目前为止,我已经提出了以下实用程序函数来执行展开:
public static RuntimeException unwrapCompletionException(CompletionException e) {
Throwable cause = e.getCause();
if (cause instanceof RuntimeException) {
return (RuntimeException) cause;
} else if (cause instanceof InterruptedException) {
Thread.currentThread().interrupt();
return new RuntimeException(e.getCause());
} else {
// Any other checked exception
return new RuntimeException(e.getCause());
}
}
例如,效用函数可以这样使用:
try {
completableFuture.join();
} catch (CompletionException e) {
throw unwrapCompletionException(e);
} catch (CancellationException e) {
// Handled separately...
}
我的问题是关于这种方法的安全性和解包代码的完整性。比如说,
InterruptedException
是我能想到的一种特殊情况,但也可能存在其他情况。也许还有其他的后果我没有考虑。在任何情况下处理CompletionException
时,我的实用程序函数是否缺少任何东西来执行我想要执行的操作?您也可以使用CompletableFuture exception()
直接从底层代码访问抛出的异常;也不确定这是否会改善代码的整体性能,但之后您可以跳过ExecutionException
展开。这是@daniu的一个好观点,但在这种情况下,我想让异常传递回调用方。您认为为什么要抛出新的RuntimeException(e.getCause())
比您捕获的CompletionException
更好?您还可以使用CompletableFuture exception()
直接从底层代码访问抛出的异常;也不确定这是否会改善代码的整体性能,但之后您可以跳过ExecutionException
展开。这是@daniu的一个好观点,但在这种情况下,我想让异常传递回调用方。您认为为什么要抛出新的RuntimeException(e.getCause())
比您捕获的CompletionException
更好?