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

前端之家收集整理的这篇文章主要介绍了java-如何处理CompletableFutures链中的错误响应? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

  1. CompletableFuture.supplyAsync(() -> {
  2. //some api call
  3. Response response = request.send();
  4. if(response.hasError()){ //this is what I am doing right now
  5. logger.error("this is error response");
  6. throw new ResponseErrorException("Error response received for request");
  7. }
  8. })

对于链中的每个步骤,基本上都重复此过程.

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

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

最佳答案
我的建议是将Decorator模式用于响应.建议你有这样的东西

  1. CompletableFuture
  2. .supplyAsync(() -> {
  3. //some api call
  4. Response response = request.send();
  5. if(response.hasError()){ //this is what I am doing right now
  6. throw new ResponseErrorException("Error response received for request");
  7. }
  8. })
  9. .thenApply(() -> {
  10. //some api call
  11. Response response = request.send();
  12. if(response.hasError()){ //this is what I am doing right now
  13. throw new ResponseErrorException("Another Error response received for request");
  14. }
  15. })
  16. .exceptionally(ex -> "Error: " + ex.getMessage());

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

  1. CompletableFuture
  2. .supplyAsync(() -> {
  3. //some api call
  4. Response response = ThrowExceptionOnErrorResponse(request.send());
  5. })
  6. .thenApply(() -> {
  7. //some api call
  8. Response response = ThrowExceptionOnErrorResponse(request.send());
  9. }
  10. })
  11. .exceptionally(ex -> "Error: " + ex.getMessage());
  12. class ThrowExceptionOnError implements Response {
  13. Response originalResponse;
  14. ThrowExceptionOnError(Response originalResp) {
  15. if(response.hasError()) {
  16. throw new ResponseErrorException("Another Error response received for request");
  17. }
  18. this.originalResponse = originalResponse;
  19. }

猜你在找的Java相关文章