为什么Mono.doOnSuccess()抑制错误?

时间:2018-09-03 15:34:47

标签: project-reactor

在下面的代码段中,如预期的那样,引发了异常:

@Test
public void testError()
{
    Mono.error(new NullPointerException())
        .subscribe();
}

但是,在以下代码段中没有引发异常:

@Test
public void testErrorWithDoOnSuccess()
{
    Mono.error(new NullPointerException())
        .doOnSuccess(aValue -> {})
        .subscribe();
}

当我使用块运算符而不是订阅运算符时,异常再次起作用:

@Test
public void testErrorWithDoOnSuccessAndBlock()
{
    Mono.error(new NullPointerException())
        .doOnSuccess(aBoolean -> {})
        .block();
}

Mono.doOnSuccess运算符的文档中没有具体说明其行为。错误,但是在给定运算符名称的情况下,我完全不会期望这种行为。为什么它抑制异常(并且仅在不使用块运算符的情况下)?这是预期的行为,还是错误?

使用的反应器版本是撰写本文时的最新版本,3.1.8.RELEASE

1 个答案:

答案 0 :(得分:0)

这是一个错误,在您使用doOnTerminate / doAfterTerminate而不是{{1的情况下,操作员应仅抑制“未实现错误回调” }} ...

也就是说,操作员仍在传播NPE,并且可以通过实施最佳实践轻松解决此错误:始终在doOnSuccess 中至少定义值处理程序和错误处理程序。