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