Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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 可完成未来的分离异常处理_Java_Java 8_Completable Future - Fatal编程技术网

Java 可完成未来的分离异常处理

Java 可完成未来的分离异常处理,java,java-8,completable-future,Java,Java 8,Completable Future,我意识到我希望API的使用者不必处理异常。或者更清楚地说,我希望确保总是记录异常,但只有消费者知道如何处理成功。我希望客户机能够处理异常,如果他们愿意,没有有效的文件可以返回给他们 注:FileDownload是供应商 @覆盖 公共CompletableFuture processDownload(最终文件下载文件下载){ Objects.requirennull(文件下载); setDirectory(getTmpDirectoryPath()); CompletableFuture=Comp

我意识到我希望API的使用者不必处理异常。或者更清楚地说,我希望确保总是记录异常,但只有消费者知道如何处理成功。我希望客户机能够处理异常,如果他们愿意,没有有效的
文件可以返回给他们

注:
FileDownload
供应商

@覆盖
公共CompletableFuture processDownload(最终文件下载文件下载){
Objects.requirennull(文件下载);
setDirectory(getTmpDirectoryPath());
CompletableFuture=CompletableFuture.SupplySync(文件下载,executorService);
未来…可丢弃->{
if(可丢弃!=null){
日志错误(可丢弃);
}
...
返回null;//客户端将不会接收文件。
} );
回归未来;
}

我真的不懂
CompletionStage
的东西。我是否使用
异常
句柄
?我是返回原始未来还是它们返回的未来?

假设您不想影响您的
CompletableFuture
的结果,您需要使用:

现在,当API的使用者尝试调用
future.get()
时,他们将得到一个异常,但不一定需要对它做任何处理


但是,如果您想让消费者不知道异常情况(当
文件下载失败时返回
null
),您可以使用或:


如果抛出异常,您希望未来的结果是什么?消费者应该仍然收到异常,还是你希望他们不知道发生了什么?@Jeffrey我希望他们收到异常,如果他们愿意,也可以自己处理。我不希望他们收到文件,因为这样容易得多。对异常一无所知的消费者可以简单地使用
future.thenAccept将其链接起来。这里的关键点是,在异常情况下从不调用使用者,因此它不必处理异常或
null
值。底线是,不要使用
get()
@Override
public CompletableFuture<File> processDownload( final FileDownload fileDownload ) {
    Objects.requireNonNull( fileDownload );
    fileDownload.setDirectory( getTmpDirectoryPath() );
    CompletableFuture<File> future = CompletableFuture.supplyAsync( fileDownload, executorService );
    future... throwable -> {
        if ( throwable != null ) {
            logError( throwable );
        }
        ...
        return null; // client won't receive file.
    } );
    return future;

}
future = future.whenComplete((t, ex) -> {
  if (ex != null) {
    logException(ex);
  }
});
future = future.handle((t, ex) -> {
  if (ex != null) {
    logException(ex);
    return null;
  } else {
    return t;
  }
});
future = future.exceptionally(ex -> {
  logException(ex);
  return null;
});