在 Spring webflux 中抛出异常与 Mono.error()

Throwing an exception vs Mono.error() in Spring webflux

我正在开发一个 Spring webflux 项目,我想了解 抛出异常 与使用 [=23= 之间的区别]().

如果有这样的验证 class 例如:

 public class NameValidator {

   public static boolean isValid(String name) {
     if(StringUtils.isEmpty(name)) {throw new RuntimeException("Invalid name");}
     return true;
  }
}



public class NameValidator2 {

   public static Mono<Object> isValid(String name) {
     if(StringUtils.isEmpty(name)) {
          return Mono.error(new RuntimeException("Invalid name"));}
     return Mono.just(true);

  }

 }

每种方法的优缺点是什么。在使用 spring webflux 处理反应流时什么时候使用一个而不是另一个?

基本上你最终会得到相同的结果,并且两个选项之间没有区别(也许是性能方面的,但我没有发现任何支持这个观点的东西,所以我想它可以忽略不计。 唯一的“区别”是 Mono.error 遵循 Reactive Streams 规范并抛出异常(阅读 https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#2.13 了解更多)。然而它并没有被禁止,但是如果你喜欢遵循标准和规范(我猜你喜欢)你应该考虑使用 Mono.error.

如@Joao 所述,处理错误的推荐方法是在 Publisher(Mono.error/Flux.error) 上调用 error 方法。

我想向您展示一个示例,其中传统的 throw 并不像您预期​​的那样工作:

public void testErrorHandling() {
    Flux.just("a", "b", "c")
        .flatMap(e -> performAction()
            .onErrorResume(t -> {
                System.out.println("Error occurred");
                return Mono.empty();
            }))
        .subscribe();
}

Mono<Void> performAction() {
    throw new RuntimeException();
}

永远不会执行onErrorResume运算符,因为在Mono组装之前抛出了异常。