gpt4 book ai didi

python - 当一个模块没有记录它的所有错误时要捕获哪些错误? (pliSTLib)

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:12 24 4
gpt4 key购买 nike

TL;DR:当一个模块没有记录它的所有错误时要捕获什么样的错误?

场景:

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

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

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

但我也可以通过使我的输入文件变形而至少产生 IndexErrorAttributeErrorpliSTLib 中没有记录这些。谁知道其他随机输入文件会产生什么样的额外错误?我不希望我的程序因此而失败。

所以我的问题是。我应该捕获什么?我的理解是,使用通用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com