我正在使用Where
谓词和ObservableExtensions.Subscribe(this, Action<T>)
方法订阅Observable
。
当订阅Action
中引发异常时,我可以在堆栈上看到一个名为AnonymousSafeObserver
的类,这似乎是导致在订阅Action
中发生异常后处理我的底层Observable
的原因。
这不是我所期望的行为,也不是我以前在其他订阅中看到的行为,通常异常刚刚传递给OnNext
的调用方(即可观察的)。
这种阶级/行为是在什么情况下引入的?
您不能总是依赖于它们是从观测器中的异常一直返回到订阅者的OnNext
调用的路径。任何引入异步性的东西都会破坏该链(Delay
、ObserveOn
、CombineLatest
等)。
无论如何,如果您的观测者的OnNext
处理程序抛出异常,那么Rx将假定您的观察者的状态已损坏。AnonymousSafeObserver
在这种情况下仅确保观察者从可观察对象中取消订阅,以避免内存泄漏,并避免继续向损坏的观察者发送更多事件,这可能弊大于利。这是一种快速失败的哲学。
我的理解是,只要你订阅了一个可观察的内容,就会创建其中一个。Rx对可观察器进行的内部订阅将不会使用此类,因为它们已经保证其内部观察器实现永远不会抛出异常。但由于他们将外部观察者(即你的观察者和我的观察者)视为不受信任的,因此将它们封装在其中一个对象中。