webFlux 捕获不同的异常做不同的处理
时间: 2024-03-03 21:50:46 浏览: 99
在WebFlux中,可以使用`onErrorResume`和`onErrorReturn`操作符来处理不同类型的异常,并为每个异常类型指定不同的处理逻辑。以下是一个示例代码:
```java
Mono<String> source = Mono.just("Hello").map(s -> {
if (s.equals("Hello")) {
throw new IllegalArgumentException("Invalid argument");
} else if (s.equals("World")) {
throw new NullPointerException("Null pointer");
} else {
return s.toUpperCase();
}
});
Mono<String> result = source.onErrorResume(IllegalArgumentException.class, e -> {
System.err.println("Caught IllegalArgumentException: " + e.getMessage());
return Mono.just("default");
})
.onErrorResume(NullPointerException.class, e -> {
System.err.println("Caught NullPointerException: " + e.getMessage());
return Mono.just("default");
})
.onErrorReturn(e -> "Caught other exception: " + e.getMessage());
result.subscribe(System.out::println);
```
在这个例子中,源Mono包含了三种可能的情况:如果输入为"Hello",则抛出IllegalArgumentException异常;如果输入为"World",则抛出NullPointerException异常;如果输入为其他字符串,则将字符串转换为大写并返回。使用`onErrorResume`操作符分别捕获IllegalArgumentException和NullPointerException异常,并输出错误信息,并返回一个默认值;使用`onErrorReturn`操作符捕获其他类型的异常,并返回一个指定的默认值。
需要注意的是,`onErrorResume`操作符和`onErrorReturn`操作符都是从上到下依次匹配异常类型,如果有多个操作符匹配到了同一类型的异常,则只会执行第一个匹配到的操作符。因此,建议将捕获范围小的异常类型放在前面,范围大的异常类型放在后面。
阅读全文