java - 如何处理 CompletableFuture 链中的错误响应?

标签 java asynchronous exception completable-future

我的项目中有一长串可完成的 future,每个步骤都会调用一个后端 API,它可以给出多个错误响应和一个成功响应。现在,解析响应后,我需要判断它是否是错误,然后需要显示给用户。我还需要知道我的链中的哪个阶段产生了此错误。

我现在的方法(如下所示)是每当遇到错误响应时抛出运行时异常,然后将异常 block 附加到我的链中。我觉得这不是最好的方法,因为运行时异常不适合这种情况。它还使我的代码变得丑陋,因为每当我处理响应时我都必须这样做,从而导致额外的异常检查。有更好的方法吗?

CompletableFuture.supplyAsync(() -> {
    //some api call
    Response response = request.send();

    if(response.hasError()){ //this is what I am doing right now
        logger.error("this is error response");
        throw new ResponseErrorException("Error response received for request");
    }
})

这对于链中的每个步骤基本上都是重复的。

摘要:如果我在 CompletableFuture 链中的任何步骤中收到失败响应,将其传播给用户的好方法是什么?

编辑:如果没有更好的方法,请随时分享您对我的方法的看法。

最佳答案

我的建议是使用Decorator响应的模式。建议你有这样的东西

CompletableFuture
.supplyAsync(() -> {
    //some api call
    Response response = request.send();

    if(response.hasError()){ //this is what I am doing right now
        throw new ResponseErrorException("Error response received for request");
    }
})
.thenApply(() -> {
    //some api call
    Response response = request.send();

    if(response.hasError()){ //this is what I am doing right now
        throw new ResponseErrorException("Another Error response received for request");
    }
})
.exceptionally(ex -> "Error: " + ex.getMessage());

如果您想避免重复抛出异常,可以使用以下方法

CompletableFuture
.supplyAsync(() -> {
    //some api call
    Response response = ThrowExceptionOnErrorResponse(request.send());
})
.thenApply(() -> {
    //some api call
    Response response = ThrowExceptionOnErrorResponse(request.send());
    }
})
.exceptionally(ex -> "Error: " + ex.getMessage());

class ThrowExceptionOnError implements Response {

    Response originalResponse;

    ThrowExceptionOnError(Response originalResp) {
        if(response.hasError()) {
           throw new ResponseErrorException("Another Error response received for request");
        }
        this.originalResponse = originalResponse;
}

关于java - 如何处理 CompletableFuture 链中的错误响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594872/

相关文章:

java - 将返回值传递给匿名类

c# - 如何等待(在异步方法中)包含 C# 方法调用的 linq 请求

exception - Zend : Accessing model from Bootstrap raises an exception

c# - MySql + Entity Framework = 每个派生表必须有自己的别名

c# - 从异步方法更新进度条

java.lang.IllegalArgumentException,我在游戏商店的崩溃报告中得到了这个异常,建议我如何解决这个问题......

java - 将 ImageView 实现为 SurfaceView

java - 如果我添加 @Size(min>2) 是否还使用 @NotNull 注释?

java - 在 Java 中旋转多边形

ruby-on-rails - Rails 后台/异步任务要求