Error handling 复杂函数的Pythonic错误处理
我想知道是否有一种python方法来处理长时间运行的函数中的错误,这些函数中的错误部分不会影响函数继续运行的能力Error handling 复杂函数的Pythonic错误处理,error-handling,python,Error Handling,Python,我想知道是否有一种python方法来处理长时间运行的函数中的错误,这些函数中的错误部分不会影响函数继续运行的能力 作为一个例子,考虑给定URL列表的函数,它递归地检索顶级URL路径下的资源和所有链接的资源。它将检索到的资源存储在本地文件系统中,该文件系统具有镜像URL结构的目录结构。本质上,这是一个页面列表的基本递归wget 此功能可能会在许多方面失败: URL可能无效或无法解析 主机可能无法访问(可能是暂时的) 本地保存可能有磁盘错误 还有什么你能想到的吗 检索或保存任何一个资源失败只会影
作为一个例子,考虑给定URL列表的函数,它递归地检索顶级URL路径下的资源和所有链接的资源。它将检索到的资源存储在本地文件系统中,该文件系统具有镜像URL结构的目录结构。本质上,这是一个页面列表的基本递归wget
此功能可能会在许多方面失败:- URL可能无效或无法解析
- 主机可能无法访问(可能是暂时的)
- 本地保存可能有磁盘错误
- 还有什么你能想到的吗
- 在列表中记录发生的错误,并中止处理该资源的任何子资源,但继续处理下一个资源。如果出现太多错误,可以使用阈值中止整个函数,或者尝试所有操作。调用方可以在函数完成时查询此列表,以查看是否存在任何问题
- 调用方可以提供一个可调用的对象,该对象在每次发生错误时都会被调用。这将把记录错误的责任转移回调用者。您甚至可以指定,如果callable返回False,则处理应该停止。这将把阈值管理移到调用方
- 用后者实现前者,提供一个错误处理对象,而不是编码前者的行为
注意:请不要将重点放在示例上。我并不想解决这一特定领域的问题,但这似乎是一个很好的例子,这里的大多数人都会理解。错误处理应该依赖于异常和日志记录,因此对于每个错误,都会引发异常并记录错误消息 然后在任何调用方函数级别捕获异常,如果需要,记录任何其他错误并处理该问题 如果问题没有得到完全处理,那么上层可以捕获相同的异常并执行不同的操作
在任何一个阶段中,您都可以保留某些类型异常的计数器,以便只有在出现特定数量的问题时才能执行某些操作。我不认为在您这里讨论的级别上有一个特别明确的“Pythonic/non Pythonic”区别 在这个领域没有“一刀切”的解决方案的一个重要原因是,您想要的确切语义将是特定于问题的
- 对于一种情况,第一次失败时中止可能就足够了
- 另一方面,如果任何操作失败,您可能需要中止和回滚
- 第三,您可能希望完成尽可能多的操作,只需记录并忽略故障
- 对于第四种选择,您可能希望完成尽可能多的操作,但在最后引发异常以报告任何失败的操作
- 如果天真的方法是足够的,不要弄乱它
- 如果在列表中收集故障并报告单个错误就足够了,那么就这样做
- 如果您需要在某个部分出现故障时回滚所有内容,那么就这样实现它
- 如果存在用于自定义错误处理的真正用例,那么接受错误处理程序作为API的一部分。但是当你做这件事的时候,记住一个特定的用例,不要仅仅为了它而做。当您这样做时,如果用户没有指定一个默认处理程序,则使用一个合理的默认处理程序(这可能只是天真的“立即提升”方法)
def myFunction(an_arg, error_handler)
# Do stuff
if err_occurred:
if isinstance(err, RuntimeError):
error_handler.handleRuntimeError()
elif isinstance(err, IOError):
error_handler.handleIOError()