首页 > 解决方案 > 如何处理 CompletableFutures 链中的错误响应?

问题描述

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

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

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 链中的任何步骤中收到失败响应,那么将其传播给用户的好方法是什么?

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

标签: javaasynchronousexceptionexception-handlingcompletable-future

解决方案


我的建议是使用装饰器模式进行响应。建议你有这样的东西

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;
}

推荐阅读