【发布时间】:2012-02-17 15:25:02
【问题描述】:
当我调用与shutil、http等系统库交互的代码时,我发现自己在没有指定异常类型的情况下处理异常,如果系统处于意外状态(例如文件锁定、网络不可用),所有这些都可能抛出等)
try:
# call something
except:
print("OK, so it went wrong.")
这让我很困扰,因为它还会捕获 SyntaxError 和其他基于程序员错误的异常,而且我已经看到了避免此类开放式异常处理程序的建议。
是否存在所有运行时错误都源自我可以在这里使用的一些常见异常基类的约定?或者任何不涉及语法错误、模块导入失败等的事情?即使KeyError 我也会考虑一个错误,因为如果我不能 100% 确定密钥会在那里,我倾向于使用 dict.get()。
我不想列出每一种可能的异常类型,尤其是因为我调用了很多我无法控制的支持代码。
更新:好的,答案让我意识到我问错了问题——我真正想知道的是是否有 Python 约定或明确建议库编写者使用特定的基础类为他们的例外,以便将他们与更平凡的SyntaxError 和朋友区分开来。
因为如果图书馆作者有一个约定,作为图书馆消费者,我可以对可能抛出的内容做出一般假设,即使具体情况可能会有所不同。不确定这是否更有意义?
UPDATE AGAIN:Sven 的回答终于让我明白,与其放弃和捕获顶层的一切,我可以在较低层处理和细化异常,因此顶层只需要从下面的级别担心特定的异常类型。
谢谢!
【问题讨论】:
-
谢谢,我已经搜索过,但没有找到明确的答案。解析/语法/程序员错误和运行时错误之间的区别在哪里?
-
请注意,您通常无法捕获
SyntaxError——它会在编译源代码时被抛出,远在它执行之前。如果您的try块包含import、exec、execfile()或eval(),则可以捕获SyntaxError的唯一情况。 -
@SvenMarnach:嗯,我确信我已经看到这些无类型处理程序甚至可以捕获语法错误,但它可能是别的东西,更微妙。我手边没有一个干净的例子。谢谢指正。
-
@KimGräsman:
SyntaxError表示某些文件甚至无法解析,因此代码不可能开始执行 -- 另见stackoverflow.com/questions/1856408/…。 -
您可以在
exec或eval()上捕获SyntaxError,如果您正在导入的模块中存在语法错误,我也会考虑import。
标签: python