java - 如何处理 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 链中的任何步骤中收到失败响应,那么将其传播给用户的好方法是什么?
编辑:如果没有更好的方法,请随时分享您对我的方法的看法。
解决方案
我的建议是使用装饰器模式进行响应。建议你有这样的东西
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;
}
推荐阅读
- python - 你如何将数据框转换为二维 numpy 数组
- php - OneSignal:仅向一位用户发送推送通知
- java - 如何用 Spring 或 POJO 类替换 org.jboss.resteasy.core.ResourceMethodInvoker
- python - 随着阶数的增加,巴特沃斯滤波器看起来很奇怪
- haskell - 什么是“你调用的函数”,什么是“调用你的函数”?
- python - 如何知道列表中的元素是否在另一个列表中
- excel - 无法获取 WorksheetFunction 类的 SumProduct 属性
- r - Webscraping 具有可变长度的 html 表 - 在构建数据框时,如何确保我的数据最终出现在正确的列中?
- mule - Mulesoft dataweave 中的 15 天规则
- angular - Angular - 从其他组件刷新组件:子到父然后父到另一个子通信