【webFlux】Flux如何捕获Exception异常

Flux如何捕获NullPointerException

可以使用onErrorResume操作符来处理Flux操作中发生的异常,包括NullPointerException。onErrorResume操作符会在发生异常时捕获该异常并返回一个备用的Flux,从而避免程序由于异常而崩溃。

以下是一个示例代码:

Flux<String> source = Flux.just("Hello", "World", null, "!");
Flux<String> result = source.map(s -> s.toUpperCase())
                          .onErrorResume(NullPointerException.class, e -> {
                              System.err.println("Caught NullPointerException: " + e.getMessage());
                              return Flux.empty();
                          });
result.subscribe(System.out::println);

在这个例子中,源Flux包含了一个空值,如果不处理空值,将会抛出NullPointerException。使用map操作符将字符串转换为大写时,如果遇到空值,就会抛出NullPointerException异常。使用onErrorResume操作符捕获这个异常,输出错误信息,并返回一个空的Flux,从而避免程序崩溃。

需要注意的是,onErrorResume操作符只会捕获指定类型的异常。如果发生了其他类型的异常,程序仍然会崩溃。因此,建议在使用onErrorResume操作符时,尽可能地指定需要捕获的异常类型。


Mono如何捕获NullPointerException

可以使用onErrorResume操作符来处理Mono操作中发生的异常,包括NullPointerException。onErrorResume操作符会在发生异常时捕获该异常并返回一个备用的Mono,从而避免程序由于异常而崩溃。

以下是一个示例代码:

Mono<String> source = Mono.just("Hello").map(s -> s.toUpperCase())
                                .then(Mono.just(null))
                                .map(s -> s.toLowerCase());
Mono<String> result = source.onErrorResume(NullPointerException.class, e -> {
                              System.err.println("Caught NullPointerException: " + e.getMessage());
                              return Mono.empty();
                          });
result.subscribe(System.out::println);

在这个例子中,源Mono包含了一个空值,如果不处理空值,就会抛出NullPointerException。使用map操作符将字符串转换为大写时,并且使用then操作符添加了一个空值,如果遇到空值,就会抛出NullPointerException异常。使用onErrorResume操作符捕获这个异常,输出错误信息,并返回一个空的Mono,从而避免程序崩溃。

需要注意的是,onErrorResume操作符只会捕获指定类型的异常。如果发生了其他类型的异常,程序仍然会崩溃。因此,建议在使用onErrorResume操作符时,尽可能地指定需要捕获的异常类型。


捕获不同的异常做不同的处理

在WebFlux中,可以使用onErrorResumeonErrorReturn操作符来处理不同类型的异常,并为每个异常类型指定不同的处理逻辑。以下是一个示例代码:

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操作符分别捕获IllegalArgumentExceptionNullPointerException异常,并输出错误信息,并返回一个默认值;使用onErrorReturn操作符捕获其他类型的异常,并返回一个指定的默认值。

需要注意的是,onErrorResume操作符和onErrorReturn操作符都是从上到下依次匹配异常类型,如果有多个操作符匹配到了同一类型的异常,则只会执行第一个匹配到的操作符。因此,建议将捕获范围小的异常类型放在前面,范围大的异常类型放在后面。

你可能感兴趣的:(webFlux,java,webFlux)