CompletableFuture的单独异常处理

时间:2016-05-04 16:12:43

标签: java java-8 completable-future

我意识到我希望我们API的消费者不必处理异常。或者更清楚的是,我希望确保始终记录异常,但只有消费者才知道如何处理成功。我希望客户端能够处理异常,如果他们想要的话,没有有效的File可以返回给他们。

注意:FileDownloadSupplier<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?我会回到原来的未来还是他们回来的未来?

1 个答案:

答案 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::handleCompletableFuture::exceptionally:< / p>

future = future.exceptionally(ex -> {
  logException(ex);
  return null;
});

contains_point