9

我意识到我希望我们 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东西。我使用exceptionorhandle吗?我返回原来的未来还是他们返回的未来?

4

1 回答 1

17

假设你不想影响你的结果CompletableFuture,你会想要使用CompletableFuture::whenComplete

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

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


但是,如果你想让你的消费者不知道异常(失败null时返回fileDownload),你可以使用CompletableFuture::handleor CompletableFuture::exceptionally

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

或者

future = future.exceptionally(ex -> {
  logException(ex);
  return null;
});
于 2016-05-04T16:25:33.927 回答