python - 当模块未记录其所有错误时要捕获哪些错误? (pliSTLib)

标签 python python-2.7 error-handling try-catch plist

TL;DR:当模块未记录其所有错误时要捕获哪种类型的错误?

场景:

我正在尝试阅读一系列property lists使用plistlib 。我无法控制这些文件。如果无法读取文件,我想跳过它。

我的问题是我应该捕获什么样的错误?

pliSTLib.readPlist 文档 IOErrorxml.parsers.expat.ExpatError

但我也可以通过对输入文件进行错误处理来至少产生 IndexErrorAttributeError 。这些没有记录在 pliSTLib 中。谁知道其他随机输入文件可能会产生什么样的额外错误?我不希望我的程序因此而失败。

所以我的问题是。我应该捕获什么?我的理解是,使用通用 except 捕获任何错误并不是首选,因为它掩盖了其他错误,例如 KeyboardInterrupt 。由于这是一个命令行应用程序,我不想忽略此类事件。

代码:

import plistlib
import sys

def main():
    paths = []  # from sys.argv

    for path in paths:
        try:
            plist = plistlib.readPlist(path)
        except:  # What to catch here?
            sys.stderr.write('Couldnt read plist. Ignoring.')
            continue

        process(plist) 

Python 2.7,OS X。

最佳答案

如果您无法做得更好,则 except Exception: 会避免捕获 KeyboardInterruptSystemExit

但是它确实捕获了 StopIterationGeneratorExit。也许您可以安全地向下移动到捕获 StandardError (排除这些错误),因为除了迭代器之外的任何代码通常都会认为让 StopIteration 逃逸是错误的。但谁知道呢,也许有一些输入会导致库在耗尽的迭代器上调用 next 而无法捕获它。

StandardError 仍然捕获 SyntaxErrorTypeError,它们通常是程序员错误而不是错误输入的指示。但是没有一个类可以同时捕获 LookupErrorMemoryError(这两者都适合在此处捕获),而不是 SyntaxError。因此,这就是您无需文档或大量测试即可确定代码真正抛出的内容的最大程度。

请注意,MemoryError 不足以了解错误是暂时的(它会在另一天或另一台机器上工作)还是永久性的(输入文件太大,以至于无法想象的机器会发生错误)能够处理它)。

关于python - 当模块未记录其所有错误时要捕获哪些错误? (pliSTLib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39488045/

相关文章:

c - C 中的错误处理

python - 在 postgresql 查询中使用 python 列表

python - 启动anaconda后,“pythonw.exe停止工作”崩溃错误

python - 导入错误: cannot import name model_fn: Tensorflow

python - 如何在access数据库中创建小数字段?

Python:打印 key 大小的可能字母组合

Python facebookads sdk - 找不到publisher_platform故障

python 将每小时数据 [1-24] 添加到日期时间数据

sql - Powershell 使用 ExecuteNonQuery() 尝试 Catch

php - 从PHP生产站点获取错误的最佳方法是什么?