在Project Reactor流中如何包装异常并返回指定结果?
问题分析
原代码中,onErrorResume是作用在整个Flux上的错误恢复操作:当处理元素0抛出ArithmeticException时,原Flux会被直接终止,替换成返回9的新Flux,导致原Flux中后续的元素4完全没有被处理,最终输出缺少了对应4的结果。
解决方案
要实现单个元素出错时返回默认值、同时继续处理流中其他元素的需求,需要将每个元素的异常处理隔离在独立的上下文里。可以用flatMap将每个元素包装为Mono,并在单个Mono上使用onErrorResume处理异常,这样单个元素的错误不会影响整个流的执行。
修正后的代码:
Flux<Integer> flux = Flux.just(1, 0, 4).cache(); flux.flatMap(i -> // 将每个元素包装为Mono,单独处理异常 Mono.just(i) .map(num -> 2 / num) .onErrorResume(e -> Mono.just(9)) // 捕获异常时返回默认值9 ) .map(i -> i * 2) .map(i -> i + "here1") .subscribe(System.out::println);
输出结果
运行上述代码后,将得到你期望的输出:
4here1 18here1 0here1
内容的提问来源于stack exchange,提问作者wwulfric
相关产品推荐
相关产品推荐

