2013-05-29 163 views
2

是否可以設計一個Rx運算符來吞食同一序列中的重複異常(與Retry或Catch不同)?本質上與.Select(x => x)相同,但忽略了一路上的異常。 (我知道這是違反準則)。吞嚥IObservable異常

+0

你在說什麼情況,其中'IObserver .OnError'被稱爲不止一次? –

+0

也許你可以發佈你的場景?正確的答案可能是一個稍有不同的問題。 –

回答

6

簡短答案是「否」。

稍微短一點的答案是你的前提是有缺陷的;這是因爲你不能有一個Observable拋出多個錯誤,而你假設的操作符將是一個Observer。根據定義,觀察者不應該影響觀察者(只是不要告訴Heisenberg我說過)。

因此,這樣的操作在邏輯上是不可能的,因爲它需要改變歷史 - 回去阻止你可觀察到從以往已經拋出的異常。當然,除非你的Observable打破了Rx的規則。

不要讓它做。 :) Rx無論如何都會做好阻止這件事的工作。例如,Subject<T>就是在第一個OnError之後不會發布。

2

所有的Rx操作符都遵循指導原則(它們保證您只會收到一個錯誤,然後可以完成觀察)。所以任何通過Reactive庫創建的observable將永遠不會被允許通過以允許多個錯誤。

您需要編寫自己的自定義實現IObservable<T>和您自己的自定義運算符(它沒有使用任何Reactive運算符)來實現您想要的。

但我不建議在沒有進一步設計工作的情況下走下去。你真的想要達到什麼目標,你是否可能將問題建模錯誤?如果您預計會出現多個錯誤,那麼您可能應該將這些錯誤作爲數據通過Observable發送,而不是作爲特殊條件。即在源處捕獲異常並通過其OnNext方法將其發送到IObserver<Exception>

+0

或者,爲了處理多個錯誤,您可能需要調查嵌套序列,即IObservable >。有些運營商已經開始使用這個概念,比如Switch/Merge/Concat ... –