在看了Twisted's Deferred
class和HeavyLifters Deferred Library之後,我發現如果先前的結果值是Failure
類的實例,則會觸發errbacks。這讓我想到:是否有任何特殊原因返回一個特殊的對象來表示一個錯誤,而不是隻是拋出一個錯誤。在異步回調鏈中使用try catch塊返回異常有什麼好處?
據我推斷,我覺得這是更好地拋出,因爲錯誤:
- 任何值都可以拋出。
- 如果拋出的值沒有被捕獲,它會向上傳播調用堆棧。
- 有沒有需要一個特殊的
Failure
或Error
類。 - 它使得回調更像是同步代碼。
- 可以在調用堆棧的任何級別處理異常。
一些我注意到的缺點分別爲:
- 嘗試的代碼塊和捕獲錯誤可能會導致性能命中的代碼。
- 如果未捕獲到異常,則會停止執行回調鏈的其餘部分。
- 異步編程是使用try catch塊的極端反面的關鍵。
我想衡量的機率,並找出哪種方法的報告錯誤更適合在這種情況下。
這很明顯。這是因爲函數在'setTimeout'函數中被調用,它捕獲所有錯誤本身。簡單的解決方法是創建一個捕獲所有錯誤並觸發回調的閉包。因此,不是將函數傳遞給'setTimeout',而是傳遞包裝函數的閉包。我真正想知道的是,如果最好在閉包中使用try catch塊或檢查包裝函數的返回值。 –