在 RxJava 中,RxJavaPlugins.setErrorHandler 和 Subscribe onError 有什么区别?
In RxJava, what is difference between RxJavaPlugins.setErrorHandler and Subscribe onError?
RxJava中好像有两种错误:
- 订阅者在
onError
中捕获的错误
- 并且由
RxJavaPlugins.setErrorHandler
设置的处理程序全局捕获错误
我无法理解这是为什么。问题:
- 有两个错误处理程序背后的基本原理是什么?
- 是什么导致错误被发送到一个处理程序而不是另一个?
- 如何确保错误仅发送到
onError
?
您可以在 Wiki pages 上找到针对 Rx2 所做更改的大部分设计决策:
One important design requirement for 2.x is that no Throwable
errors should be swallowed. This means errors that can't be emitted because the downstream's lifecycle already reached its terminal state or the downstream cancelled a sequence which was about to emit an error.
为了确保错误仅由观察者的 onError()
消费者处理,您必须将全局处理程序设置为空消费者:
RxJavaPlugins.setErrorHandler(emptyConsumer());
订阅 onError()
处理流到达其终止状态之前发出的错误。对于流终止后或被取消后发出的错误,rxjava 默认将堆栈跟踪打印到控制台并调用未捕获的异常处理程序,即崩溃。 RxJavaPlugins.setErrorHandler(...)
因此有必要在全局范围内处理这些无法交付的异常。
参考:
https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling
RxJava中好像有两种错误:
- 订阅者在
onError
中捕获的错误
- 并且由
RxJavaPlugins.setErrorHandler
设置的处理程序全局捕获错误
我无法理解这是为什么。问题:
- 有两个错误处理程序背后的基本原理是什么?
- 是什么导致错误被发送到一个处理程序而不是另一个?
- 如何确保错误仅发送到
onError
?
您可以在 Wiki pages 上找到针对 Rx2 所做更改的大部分设计决策:
One important design requirement for 2.x is that no
Throwable
errors should be swallowed. This means errors that can't be emitted because the downstream's lifecycle already reached its terminal state or the downstream cancelled a sequence which was about to emit an error.
为了确保错误仅由观察者的 onError()
消费者处理,您必须将全局处理程序设置为空消费者:
RxJavaPlugins.setErrorHandler(emptyConsumer());
订阅 onError()
处理流到达其终止状态之前发出的错误。对于流终止后或被取消后发出的错误,rxjava 默认将堆栈跟踪打印到控制台并调用未捕获的异常处理程序,即崩溃。 RxJavaPlugins.setErrorHandler(...)
因此有必要在全局范围内处理这些无法交付的异常。
参考: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling