在 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
组装之前抛出了异常。
我正在开发一个 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
组装之前抛出了异常。