我正在做一個Spring webflux專案,我想了解拋出例外與使用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"));} if(StringUtils.isEmpty(name))
return Mono.just(true) 。
}
}
每種方法的優點和缺點是什么。在使用spring webflux處理反應式流時,什么時候應該使用其中一種而不是另一種?
uj5u.com熱心網友回復:
基本上,你最終會得到相同的結果,兩個選項之間沒有區別(也許是性能上的區別,但我沒有發現任何支持這種觀點的東西,所以我想它可以忽略不計。 唯一的 "區別 "是Mono.error遵循Reactive Streams規范,而拋出例外則不遵循該規范(請閱讀https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.3/README.md#2.13)。然而它并沒有被禁止,但是如果你喜歡遵循標準和規范(我猜你喜歡),你應該考慮使用Mono.error.
。uj5u.com熱心網友回復:
正如@Joao已經說過的,處理錯誤的推薦方法是在Publisher上呼叫error方法(Mono.error/Flux.error)。
我想向你展示一個例子,在這個例子中,傳統的throw并沒有像你所期望的那樣發揮作用:
public void testErrorHandling() {
Flux.just("a"/span>, "b"/span>, "c"/span>)
.flatMap(e -> performAction()
.onErrorResume(t -> {
System.out.println("Error occurred")。
return Mono.empty()。
}))
.subscribe()。
}
Mono<Void> performAction() {
throw new RuntimeException()。
onErrorResume運算子將永遠不會被執行,因為例外是在Mono被裝配之前拋出的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/307780.html
標籤:
