我意识到我希望我们API的消费者不必处理异常。或者更清楚的是,我希望确保始终记录异常,但只有消费者才知道如何处理成功。我希望客户端能够处理异常,如果他们想要的话,没有有效的File
可以返回给他们。
注意:FileDownload
是Supplier<File>
@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;
}
我不太了解CompletionStage
的内容。我使用exception
还是handle
?我会回到原来的未来还是他们回来的未来?
答案 0 :(得分:13)
假设您不想影响future = future.whenComplete((t, ex) -> {
if (ex != null) {
logException(ex);
}
});
的结果,您将要使用CompletableFuture::whenComplete
:
future.get()
现在,当您的API消费者试图致电null
时,他们会获得例外,但他们不一定需要对其进行任何操作。
但是,如果您希望让消费者不知道异常(fileDownload
失败时返回future = future.handle((t, ex) -> {
if (ex != null) {
logException(ex);
return null;
} else {
return t;
}
});
),您可以使用CompletableFuture::handle
或CompletableFuture::exceptionally
:< / p>
future = future.exceptionally(ex -> {
logException(ex);
return null;
});
或
contains_point