2017-03-23 51 views
1

.catch()裏面,我如何找到導致錯誤的值?在RxJS中,如何獲得導致錯誤的值?

例如,假設你有這樣的代碼:

Rx.Observable.of(42) 
.map((val) => { 
    throw new Error('oops!'); 
}) 
.catch((err) => { 
    // how can I get `42` here? 
}); 

你怎麼能知道是什麼最終導致了錯誤?

加分,這是可能的.finally()

+0

什麼拋出價值? –

回答

2

如果你想要的值,傳遞它在你的例外。

Rx.Observable.of(42) 
.map((val) => { 
    throw new AppError({message : 'oops!', contextInfo : {someName: 42}}); 
}) 
.catch((err) => { 
    // get it from the `err` object 
}); 

這需要你實現自己的某種錯誤(AppError)的,其與天然Error繼承。該技術並不特定於Rxjs,但可以在任何地方應用。 Error是一個對象,您可以通過繼承添加您認爲合適的任何字段。錯誤包含任何有關錯誤的when(tracing)/ where(blame assignment)/ why(diagnostics)方面的相關信息是一個好習慣。

關於如何創建自己的錯誤,看看Custom_Error_Types

finally操作者使用不帶任何參數的選擇器的功能。因此,如果在finally中可以這樣做,它將不會通過參數傳遞。你可能仍然可以通過關閉來完成,但這遠非我所推薦的。

UPDATE 參照How can you know what ended up causing the error?,在一般情況下你不能。就像承諾一樣,錯誤會傳播到被捕獲的地方,或者最終從承諾/可觀察的上下文中冒出來。所以通常技術應用中,fail fast的技術是最有成效:

  • 快速失敗:使用類型系統(你自己的,你的語言,否則提供) - 這樣你將確保您只處理的值預期的類型,所以你可以消除這些類型的錯誤。我用a babel plugin for contracts進行了實驗,如果你已經使用了babel,我發現它非常有用。
  • 快速失敗:儘可能早地發現錯誤,錯誤源頭越遠,調查就越困難。
  • 快速失敗:使用那些錯誤報告優於那些沒有錯誤報告的庫(沉默吞嚥錯誤是你的敵人)。好的庫將爲此提供一個配置參數。
  • 檢查堆棧跟蹤(與rxjs 5,它變得更容易做到這一點,但你還是要了解內部)
  • 添加跟蹤/你的代碼記錄信息。
+0

這在錯誤不是您創建的情況下無效。我正在尋找一個通用的解決方案,所以我可以保證如果對象具有任何類型的錯誤,則特定於該對象的引用將被清除。 – JBCP

+2

然後你應該提供一個更現實的例子,所以你可以理解你正在處理的一般情況。也就是說,即使錯誤不是你創建的錯誤,只要它具有'Error'類型,你仍然可以捕獲它並用本地數據擴展它,並在它是你的用例時重新拋出它。無論如何,你的清理必須發生在'catch'子句中,它不能發生在'finally'子句中。你能發表一個更好的例子嗎? – user3743222