9

私たちの 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。またはを使用しますexceptionhandle?元の未来を返すか、それとも彼らが返す未来を返すか?

4

1 に答える 1

17

の結果に影響を与えたくない場合はCompletableFuture、次を使用する必要がありCompletableFuture::whenCompleteます。

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

API のコンシューマーが を呼び出そうとするとfuture.get()、例外が発生しますが、必ずしもそれを処理する必要はありません。


ただし、消費者に例外を知らせないようにする場合 (失敗した場合に戻る)、 または のいずれかを使用nullできます。fileDownloadCompletableFuture::handleCompletableFuture::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 に答える