我如何在Reactor中的异常类特定后出现通用的doOnError

时间:2018-10-09 14:14:45

标签: java reactor

感觉这应该很简单,所以我可能缺少明显的东西。 我有一个简单的示例案例,其中有一个错误Mono,我希望使用通用处理程序进行异常类的特定处理。

    Mono.error(new RuntimeException())
            .doOnError(RuntimeException.class, e -> System.out.println("Caught RuntimeException"))
            .doOnError(Throwable.class, e -> System.out.println("Caught Throwable"))
            .block();

output: Caught RuntimeException
        Caught Throwable

问题在于两个使用者都将被调用(一个具有RuntimeException的使用者和一个具有Throwable的通用使用者)。如果已经调用了更具体的方法,是否有一种(干净的)方法可以避免调用通用方法?

1 个答案:

答案 0 :(得分:1)

如果有办法从错误中恢复,请改用onErrorResume函数。

Mono.error(new RuntimeException())
    .flatMap(k -> callExternalService(k)
        .onErrorResume(RuntimeException.class, this::recoverFromRuntimeExeption)
        .onErrorResume(Throwable.class, this::recoverFromThrowable)
    );

这样,您可以将Mono的执行路径从错误更改为成功,并且随后的doOnError将不会被调用。