模块没有记录其所有错误时要捕捉哪些错误? (plistlib)
TL; DR:当模块没有记录所有错误时要捕捉哪种错误?模块没有记录其所有错误时要捕捉哪些错误? (plistlib)
方案:
我试图读取使用plistlib
一系列property lists。我无法控制这些文件。如果文件无法读取,我想跳过它。
我的问题是什么样的错误,我应该追上?
plistlib.readPlist
文件IOError
和xml.parsers.expat.ExpatError
。
但我也可以生成至少IndexError
和AttributeError
只是通过malforming我的输入文件。这些没有记录在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进行轻量级脚本编写了一段时间,但从未真正花时间正确地学习它。您的回答让我有机会深入了解异常层次结构。我没有意识到'BaseException'和'Exception'之间的区别。这已经是一个很好的区别了。现在,我会用'StandardError'去。 – tombardey
'除例外:'或'除非例外为e:'可能是最常见的方式来处理未知异常类型,史蒂夫如下建议。另一个选择是只有一个'except:',然后在except块中使用'e = sys.exc_info()[0]'来检索异常实例[[1](https://wiki.python.org/)莫因/ HandlingExceptions)]。我想结果应该非常相似。 –
谢谢。我正在寻找最佳做法来处理这个问题。这有帮助! – tombardey
另一个最佳做法是签出库的源代码并搜索'rsise'来清除异常。 –