模块没有记录其所有错误时要捕捉哪些错误? (plistlib)

问题描述:

TL; DR:当模块没有记录所有错误时要捕捉哪种错误?模块没有记录其所有错误时要捕捉哪些错误? (plistlib)

方案

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

我的问题是什么样的错误,我应该追上?

plistlib.readPlist文件IOErrorxml.parsers.expat.ExpatError

但我也可以生成至少IndexErrorAttributeError只是通过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.

+1

'除例外:'或'除非例外为e:'可能是最常见的方式来处理未知异常类型,史蒂夫如下建议。另一个选择是只有一个'except:',然后在except块中使用'e = sys.exc_info()[0]'来检索异常实例[[1](https://wiki.python.org/)莫因/ HandlingExceptions)]。我想结果应该非常相似。 –

+0

谢谢。我正在寻找最佳做法来处理这个问题。这有帮助! – tombardey

+1

另一个最佳做法是签出库的源代码并搜索'rsise'来清除异常。 –

如果你不能做的更好,然后except Exception:避免赶上KeyboardInterruptSystemExit

但它确实赶上StopIterationGeneratorExit。也许你可以安全地上下移动,以捕捉StandardError(不包括那些),因为它通常会被认为是错误的,不是一个迭代器以外的任何代码,让StopIteration逃生。但是谁知道,也许有一些输入会导致图书馆在枯竭的迭代器上调用next,而不能捕捉到。

StandardError仍然捕获SyntaxErrorTypeError,这往往是程序员错误,而不是错误输入的指标。但是有映入都LookupErrorMemoryError(这两者将是适当的在这里钓),而不是SyntaxError没有单一类。所以,只要你没有文档或广泛的测试,就可以去确定代码真正抛出什么。

请注意,MemoryError不足以知道错误是暂时的(它可能在另一天或另一台机器上工作)或永久性的(输入文件太大以至于没有可以想象的机器能够处理它)。

+0

谢谢,这个帮助很大。我已经使用Python进行轻量级脚本编写了一段时间,但从未真正花时间正确地学习它。您的回答让我有机会深入了解异常层次结构。我没有意识到'BaseException'和'Exception'之间的区别。这已经是一个很好的区别了。现在,我会用'StandardError'去。 – tombardey