首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CompletableFuture的分离异常处理

CompletableFuture的分离异常处理
EN

Stack Overflow用户
提问于 2016-05-05 00:12:43
回答 1查看 13.7K关注 0票数 9

我意识到我希望API的使用者不必处理异常。或者更清楚地说,我希望确保异常总是被记录下来,但只有消费者知道如何处理成功。我希望客户端能够处理异常,如果他们愿意的话,没有有效的File可以返回给他们。

注意:FileDownload是一个Supplier<File>

代码语言:javascript
运行
复制
@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?我是返回原始的未来,还是他们返回的未来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-05 00:25:34

假设您不想影响CompletableFuture的结果,那么您将希望使用CompletableFuture::whenComplete

代码语言:javascript
运行
复制
future = future.whenComplete((t, ex) -> {
  if (ex != null) {
    logException(ex);
  }
});

现在,当你的应用程序接口的使用者试图调用future.get()时,他们会得到一个异常,但他们不一定需要对它做任何事情。

但是,如果您想让您的使用者对异常一无所知(当fileDownload失败时返回null ),您可以使用CompletableFuture::handleCompletableFuture::exceptionally

代码语言:javascript
运行
复制
future = future.handle((t, ex) -> {
  if (ex != null) {
    logException(ex);
    return null;
  } else {
    return t;
  }
});

代码语言:javascript
运行
复制
future = future.exceptionally(ex -> {
  logException(ex);
  return null;
});
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37032990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档