我使用http請求一次從API中獲取數千個實體。作爲管道中的下一步,我想將它們全部鏟入數據庫中。使用線程宏的習慣性錯誤/異常處理
(->> ids
(pmap fetch-entity)
(pmap store-entity)
(doall))
fetch-entity
期望一個String
ID,並嘗試使用HTTP請求來檢索一個實體,並且要麼返回Map
或拋出(因爲例如超時)的異常。
store-entity
預計Map
並嘗試將其存儲在數據庫中。它可能會引發異常(例如,如果Map
與數據庫模式不匹配,或者它根本沒有收到Map
)。
不雅錯誤處理
我的第一個「解決方案」是寫包裝函數fetch-entity'
和store-entity'
趕上各自原有功能異常。
fetch-entity'
在失敗時返回輸入,如果http請求失敗,基本上會傳遞String
id。這確保整個管道保持卡車運輸。
store-entity'
檢查其參數的類型。如果參數是Map
(提取實體成功並返回Map
),它會嘗試將其存儲在數據庫中。
如果存儲到數據庫的嘗試拋出一個異常,或者如果store-entity'
得以通過一個String
(ID),而不是Map
它將conj
到error_ids
外部Vector
。
通過這種方式,我可以稍後使用error_ids
來判斷出現故障的頻率以及哪些id受到影響。
它不覺得上述是一個明智的方式來實現我想要做的。例如,我寫store-entity'
的方式完成了前一個管道步驟(fetch-entity'
)的功能,因爲它的行爲因上一個管道步驟是否成功而有所不同。
還有store-entity'
請注意外部Vector
被稱爲error_ids
根本不覺得正確。
是否有一種慣用的方式來處理這種情況下,你有多個管道步驟,其中一些可以拋出異常(例如,因爲它們是I/O),我不能輕易使用謂詞來確保函數會表現出可預測性,並且我不想幹擾管道,只能稍後檢查哪些情況出錯?
你看了看:http s://github.com/adambard/failjure? –