- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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/
TL;DR:当一个模块没有记录它的所有错误时要捕获什么样的错误? 场景: 我正在尝试阅读一系列 property lists使用 plistlib .我无法控制这些文件。如果无法读取文件,我想跳过它。
我正在使用 pliSTLib 在 OS X 中创建和更新一个简单的 plist 文件。挪威的一名测试人员从 pliSTLib 中收到错误: File "../axeomatic2/normal/bui
根据 http://docs.python.org/dev/library/plistlib.html ,pliSTLib 仅从 2.6 开始可用于非 Mac 平台,但我想知道是否有办法让它在 Lin
这个问题在这里已经有了答案: python plistlib file invaded by cocoa values? (3 个答案) 关闭 8 年前。 我正在尝试使用 python 修改 pli
我正在尝试解析 iTunes 媒体库文件,该文件是使用 python 和 pliSTLib 的 plist 文件。我写了一个简单的Python脚本: import plistlib plist = p
所以,我开始了一个新的玩具项目,并决定第一次使用 Python 3... In [1]: import plistlib In [2]: with open("/Volumes/Thunderbay/
我是一名优秀的程序员,十分优秀!