首页 > 解决方案 > 记录反应链中的哪些方法出现异常

问题描述

我的反应链中有一些可以引发异常的方法。如果发生异常——我不想继续执行链,并且我想记录——究竟是什么动作引发了异常。

我写了一个代码,看起来像这样:

   Mono<Void> mono = Mono.just(10)
            .map(a -> action1(a))
            .doOnError((t) -> System.out.println("action 1 threw an exception"))
            .onErrorStop()
            .map(a -> action2(a)) 
            .doOnError((t) -> System.out.println("action 2 threw an exception"))
            .then();
    
    mono.subscribe();

但是当action1抛出异常时 - 我得到以下输出:

action 1 threw an exception
action 2 threw an exception

出乎我的意料

标签: javaproject-reactorreactive

解决方案


  1. 您需要将反应链视为管道或数据流。在管道中,错误也是与其他数据相同的数据。
  2. flatMap()当数据可用时,该方法将信号更改为另一个(单声道或通量)。
Mono<Void> mono = Mono.just(10)
                .map(a -> action1(a))
                .doOnError((t) -> System.out.println("action 1 threw an exception"))
                .flatMap(a -> Mono.just(a)
                        .map(value -> action2(value))
                        .doOnError((t) -> System.out.println("action 2 threw an exception"))
                        .then()
                )
                .then();
        mono.subscribe();

推荐阅读