感觉这应该很简单,所以我可能缺少明显的东西。 我有一个简单的示例案例,其中有一个错误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的通用使用者)。如果已经调用了更具体的方法,是否有一种(干净的)方法可以避免调用通用方法?
答案 0 :(得分:1)
如果有办法从错误中恢复,请改用onErrorResume函数。
Mono.error(new RuntimeException())
.flatMap(k -> callExternalService(k)
.onErrorResume(RuntimeException.class, this::recoverFromRuntimeExeption)
.onErrorResume(Throwable.class, this::recoverFromThrowable)
);
这样,您可以将Mono的执行路径从错误更改为成功,并且随后的doOnError
将不会被调用。