在RxJava中,RxJavaPlugins.setErrorHandler和Subscribe onError有什么区别?

时间:2017-06-22 14:01:05

标签: java rx-java rx-java2

似乎RxJava中存在两种错误:

  1. 订阅者在onError
  2. 中捕获的错误
  3. RxJavaPlugins.setErrorHandler
  4. 设置的处理程序全局捕获错误

    我很难理解为什么会这样。问题:

    • 有两个处理程序出错的理由是什么?
    • 导致错误发送到一个处理程序与另一个处理程序的原因是什么?
    • 如何确保错误仅发送到onError

2 个答案:

答案 0 :(得分:3)

您可以在Wiki pages上找到针对 Rx2 所做更改的大部分设计决策:

  

2.x的一个重要设计要求是不应该吞下Throwable个错误。这意味着无法发出错误,因为下游的生命周期已经到达终端状态,或者下游取消了即将发出错误的序列。

为确保错误仅由观察者的onError()消费者处理,您必须将全局处理程序设置为空消费者:

RxJavaPlugins.setErrorHandler(emptyConsumer());

答案 1 :(得分:0)

订阅onError()处理流达到其终端状态之前发出的错误。对于流终止或取消后发出的错误,rxjava默认将堆栈跟踪打印到控制台并调用未捕获的异常处理程序,即崩溃。因此,RxJavaPlugins.setErrorHandler(...)对于在全局范围内处理这些不可交付的异常很有必要。

参考: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling

https://github.com/ReactiveX/RxJava/issues/5425