繁体   English   中英

如何在处理 Mono 时显式抛出错误

[英]How to throw an Error explicitly while processing Mono

我需要知道如何在执行 Mono 时显式抛出异常。我无法订阅,阻止 Mono,因为它有结束(下游)订阅者。 只需要验证数据并显式抛出异常来执行重试。

    public Mono<Response> handleResponse() {
        return userService.getUser()
                .doOnNext(response -> validate(response.getData()))
                .onErrorResume(ex -> {
                    // not working
                    throw Exceptions.propagete(ex);
                });
    }
    
    private void validate() {
        .....
        throw new RuntimeException();
    }
@Retyable(value = {RuntimeException.class})

如果没有异常,它将返回 Mono 到下一级。 我可以使用 Mono 重试,但需要知道有什么办法可以解决这个问题。

要产生错误,您可以使用Mono.error(throwable)

但是代码中的另一个问题是您在doOnNext中进行验证,这不应该改变流程。 最好使用flatMap

你可以这样做:

userService.getUser()
            .flatMap(response -> {
               try {
                  validate(response.getData());
                  return Mono.just(response);
               } catch (Throwable t) {
                  return Mono.error(t);
               }
            })

最简单的方法如下:

getUser()
    .map(response -> {
        validate(response);
        return response;
    })

如果您可以更改validate方法,我建议您按以下方式进行:

getUser()
    .handle((response, sink) -> {
        if (isValid(response)) {
            sink.next(response);
        } else {
            sink.error(new RuntimeException("..."));
        }
    })

// where
public boolean isValid(User user) {
    //...
}

如果你尝试这样的事情怎么办:

    public Mono<Response> handleResponse() {
            return Mono.fromFuture(userService.getUser()
                    .doOnNext(response -> validate(response.getData()))
                    .handle((response, throwable) -> {
                          if (throwable == null) {
                              return response;
                          } else {
                              throw new RuntimeException();
                          }
                     });
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM