我正在做一个Spring webflux项目,我想了解抛出异常与之间的区别vs使用mono_error ().
如果有这样的验证类,例如:
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处理响应式流时,什么时候使用其中一个而不是另一个?
正如@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
被组装之前抛出异常。
基本上你最终会得到相同的结果,两种选择之间没有区别(可能是性能方面的,但我没有发现任何支持这种观点的东西,所以我想它可以忽略不计。唯一的"区别"是单核细胞增多症。error遵循响应式流规范,而抛出异常则不遵循(详见https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#2.13)。然而,这并不是被禁止的,但是如果你喜欢遵循标准和规范(我猜你喜欢),你应该考虑使用mono_error。