【发布时间】:2011-04-04 06:53:53
【问题描述】:
我想知道是否有一种 Pythonic 方式来处理长时间运行的函数中的错误,这些错误可能会出现部分不影响函数继续能力的错误。
例如,考虑一个给定 URL 列表的函数,它递归地检索顶级 URL 路径下的资源和所有链接资源。它将检索到的资源存储在本地文件系统中,其目录结构反映了 URL 结构。本质上,这是一个页面列表的基本递归 wget。
这个函数在很多地方可能会失败:
- 网址可能无效或无法解析
- 主机可能无法访问(可能是暂时的)
- 本地保存可能会出现磁盘错误
- 你能想到的任何其他东西。
检索或保存任何一个资源失败只会影响函数继续处理该资源以及可能从该资源链接的任何子资源的能力,但可以继续检索其他资源。
错误处理的一个简单模型是,在第一个错误时,会引发适当的异常供调用者处理。这样做的问题是它终止了函数并且不允许它继续。错误可能会被修复,函数从头开始重新启动,但这会导致工作重做,任何永久性错误都可能意味着我们永远无法完成。
我想到的几个选择是:
- 在列表中记录发生的错误并中止处理该资源的任何子资源,但继续处理下一个资源。如果发生太多错误,可以使用阈值来中止整个函数,或者可能只是尝试一切。调用者可以在函数完成时询问这个列表,看看是否有任何问题。
- 调用者可以提供一个可调用对象,每个错误都会调用该对象。这将记录错误的责任转移回调用者。您甚至可以指定如果可调用返回 False 则应停止处理。这会将阈值管理转移给调用者。
- 用后者实现前者,提供一个错误处理对象,而不是对前者的行为进行编码。
在 Python 讨论中,我经常注意到某些被描述为 Python 或非 Python 的方法。我想知道是否有任何特别 Pythonic 的方法来处理上述类型的场景。
Python 是否包含比异常处理终止模型更复杂的错误处理模型的电池,或者包含的更复杂的电池是否使用我应该复制以保持 Pythonic 的错误处理模型?
注意:请不要专注于示例。我不打算解决那个特定领域的问题,但这似乎是一个很好的例子,这里的大多数人都会理解。
【问题讨论】:
-
我刚刚读到的东西提供了另一种思考方式:lubutu.com/soso/condition-handling-for-non-lispers
标签: error-handling python