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
を使用しますか?元の未来を返すのですか、それとも彼らが返す未来を返すのですか?
CompletableFuture
の結果に影響を与えたくないと仮定すると、 _CompletableFuture::whenComplete
_ を使用する必要があります。
_future = future.whenComplete((t, ex) -> {
if (ex != null) {
logException(ex);
}
});
_
これで、APIのコンシューマーがfuture.get()
を呼び出そうとすると、例外が発生しますが、必ずしもそれを使用して何もする必要はありません。
ただし、消費者に例外を知らないようにしたい場合(null
が失敗したときにfileDownload
を返す)、 _CompletableFuture::handle
_ または-のいずれかを使用できます。 _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;
});
_