为什么 Mono.doOnSuccess() 会抑制错误?
Why does Mono.doOnSuccess() suppress errors?
在下面的代码片段中,正如所料,抛出了一个异常:
@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
运算符的文档没有具体说明其行为 w.r.t。错误,但考虑到操作员的名称,我根本不希望出现这种行为。为什么它会抑制异常(并且仅在不使用块运算符时)?这是预期的行为,还是错误?
使用的 Reactor 版本是撰写本文时的最新版本,3.1.8.RELEASE
。
这是一个错误,在您使用 doOnTerminate
/doAfterTerminate
的情况下,操作员应该仅 抑制 "No error callback implemented" 异常,不是 doOnSuccess
...
也就是说,运算符仍然会传播 NPE,并且可以通过实施最佳实践轻松解决此错误:始终在 subscribe(...)
中至少定义值处理程序和错误处理程序.
在下面的代码片段中,正如所料,抛出了一个异常:
@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
运算符的文档没有具体说明其行为 w.r.t。错误,但考虑到操作员的名称,我根本不希望出现这种行为。为什么它会抑制异常(并且仅在不使用块运算符时)?这是预期的行为,还是错误?
使用的 Reactor 版本是撰写本文时的最新版本,3.1.8.RELEASE
。
这是一个错误,在您使用 doOnTerminate
/doAfterTerminate
的情况下,操作员应该仅 抑制 "No error callback implemented" 异常,不是 doOnSuccess
...
也就是说,运算符仍然会传播 NPE,并且可以通过实施最佳实践轻松解决此错误:始终在 subscribe(...)
中至少定义值处理程序和错误处理程序.