Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何安全地打开CompletableException_Java_Completable Future - Fatal编程技术网

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
更好?