为什么在 Python 中捕获所有异常是个坏主意?
我知道使用该except:
子句捕获所有异常甚至会捕获“特殊”python 异常:SystemExit
、KeyboardInterrupt
和GeneratorExit
. 那么为什么不只使用一个except Exception:
子句来捕获所有异常呢?
为什么在 Python 中捕获所有异常是个坏主意?
我知道使用该except:
子句捕获所有异常甚至会捕获“特殊”python 异常:SystemExit
、KeyboardInterrupt
和GeneratorExit
. 那么为什么不只使用一个except Exception:
子句来捕获所有异常呢?
因为它非常不具体,除了例外,它不能让你做任何有趣的事情。此外,如果您正在捕获每个异常,则可能会发生大量您甚至不知道正在发生的异常(这可能会导致您的应用程序在您不知道原因的情况下失败)。您应该能够预测(通过阅读文档或实验)具体需要处理哪些异常以及如何处理它们,但是如果您从一开始就盲目地抑制所有异常,您将永远不会知道。
因此,根据普遍的要求,这里有一个例子。一位程序员正在编写 Python 代码,她得到了一个IOError
. 她没有进一步调查,而是决定捕获所有异常:
def foo():
try:
f = open("file.txt")
lines = f.readlines()
return lines[0]
except:
return None
她没有以他的方式意识到问题:如果文件存在并且可以访问,但它是空的怎么办?然后此代码将引发一个IndexError
(因为列表lines
为空)。所以她会花几个小时想知道为什么None
当文件存在并且没有被锁定时她会从这个函数中返回,却没有意识到如果她更具体地捕捉错误会很明显,那就是她正在访问可能不存在的数据.
因为您可能希望以不同的方式处理每个异常。拥有 KeyInterrupt 与出现编码问题或 OS 问题并不是一回事……您可以一个接一个地捕获特定的异常。
try:
XXX
except TYPE:
YYY
except TYPE:
ZZZ