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