TL;DR:当模块未记录其所有错误时要捕获哪种类型的错误?
场景:
我正在尝试阅读一系列property lists使用plistlib
。我无法控制这些文件。如果无法读取文件,我想跳过它。
我的问题是我应该捕获什么样的错误?
pliSTLib.readPlist
文档 IOError
和 xml.parsers.expat.ExpatError
。
但我也可以通过对输入文件进行错误处理来至少产生 IndexError
和 AttributeError
。这些没有记录在 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:
会避免捕获 KeyboardInterrupt
或 SystemExit
。
但是它确实捕获了 StopIteration
和 GeneratorExit
。也许您可以安全地向下移动到捕获 StandardError
(排除这些错误),因为除了迭代器之外的任何代码通常都会认为让 StopIteration
逃逸是错误的。但谁知道呢,也许有一些输入会导致库在耗尽的迭代器上调用 next
而无法捕获它。
StandardError
仍然捕获 SyntaxError
和 TypeError
,它们通常是程序员错误而不是错误输入的指示。但是没有一个类可以同时捕获 LookupError
和 MemoryError
(这两者都适合在此处捕获),而不是 SyntaxError
。因此,这就是您无需文档或大量测试即可确定代码真正抛出的内容的最大程度。
请注意,MemoryError
不足以了解错误是暂时的(它会在另一天或另一台机器上工作)还是永久性的(输入文件太大,以至于无法想象的机器会发生错误)能够处理它)。
关于python - 当模块未记录其所有错误时要捕获哪些错误? (pliSTLib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39488045/