在Rx中有三種主要方法:OnNext<T>
,OnError
和OnComplete
,並且只有OnNext
應該傳遞數據。使用異常作爲無效擴展中的數據傳輸對象
我有時間標記的數據點和數據流,其中有通過OnNext傳遞的正常值,佔數據點的99%以上。但是,一些數據點是例外的,例如延遲數據或無序數據點,重寫歷史記錄。從邏輯上講,下一個事件需要特殊處理的數據,而不是預期順序的下一個數據。
在這種情況下通過OnError
通道傳遞例外值是否爲「正常」?我可以用T
類型的屬性來定義OutOfOrderDataExcpetion<T> : Exception
,並在觀察者中對其進行處理。鑑於特殊的價值是罕見的,我不拋出/增加例外,但建設和使用它們作爲DTO,性能不應該是一個問題。
我的問題是,該方法被稱爲OnError
而不是OnException
,但我的數據不是錯誤,它只是需要特殊處理。同時,如果我將我的observable暴露給對OutOfOrderExcpetion<T>
一無所知的外部代碼,外部代碼將無法專門捕獲它,那將是一個錯誤。我可以遵循事件採購模式,並將每個數據事件封裝在一個包含命令和有效負載的包裝中,但是接下來我需要解壓每個命令,而在99%以上的情況下,它將是相同的命令「next」。使用OnError
作爲所有其他命令的通道,可以讓我幾乎採用相同的事件採購模式並進行簡化處理。
除了命名問題,你能添加一些參數來阻止我使用這種設計嗎?或者這是對異常的恰當使用?
這是一個非常好的點,OnError可能是「一個,一個只」,謝謝!你有鏈接到文檔?如果「正常」的消費者遵循規範,他們將終止和取消訂閱,並且不會看到下一個錯誤,那麼「特殊訂戶」會遇到特殊異常的問題究竟是什麼? –
在[MSDN](https://msdn.microsoft.com/en-us/library/dd783449(v = vs.110).aspx)上,對於每種方法,措辭是「通常調用」的,我無法快速找到請參考您提到的嚴格合同。 「序列已結束」由「OnComplete」指示,爲什麼接下來有一個特殊的完成方法,如果在取消令牌取消任務時可以使用TPL中的OperationCancelledException? –
@ V.B。 - 查看http://go.microsoft.com/fwlink/?LinkID=205219 - 特別是關於Rx語法的部分 - 「發送到IObserver接口實例的消息遵循以下語法:OnNext *(OnCompleted | OnError)?'。這個語法允許可觀察的序列發送任何數量的(0或更多)OnNext消息到訂閱的觀察者實例,可選地接着單個成功(OnCompleted)或失敗(OnError)消息。 – Enigmativity