我使用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? –