13

为什么在 Python 中捕获所有异常是个坏主意?

我知道使用该except:子句捕获所有异常甚至会捕获“特殊”python 异常:SystemExitKeyboardInterruptGeneratorExit. 那么为什么不只使用一个except Exception:子句来捕获所有异常呢?

4

2 回答 2

27

因为它非常不具体,除了例外,它不能让你做任何有趣的事情。此外,如果您正在捕获每个异常,则可能会发生大量您甚至不知道正在发生的异常(这可能会导致您的应用程序在您不知道原因的情况下失败)。您应该能够预测(通过阅读文档或实验)具体需要处理哪些异常以及如何处理它们,但是如果您从一开始就盲目地抑制所有异常,您将永远不会知道。

因此,根据普遍的要求,这里有一个例子。一位程序员正在编写 Python 代码,她得到了一个IOError. 她没有进一步调查,而是决定捕获所有异常:

def foo():
    try:
        f = open("file.txt")
        lines = f.readlines()
        return lines[0]
    except:
        return None

她没有以他的方式意识到问题:如果文件存在并且可以访问,但它是空的怎么办?然后此代码将引发一个IndexError(因为列表lines为空)。所以她会花几个小时想知道为什么None当文件存在并且没有被锁定时她会从这个函数中返回,却没有意识到如果她更具体地捕捉错误会很明显,那就是她正在访问可能不存在的数据.

于 2012-05-15T04:27:33.983 回答
3

因为您可能希望以不同的方式处理每个异常。拥有 KeyInterrupt 与出现编码问题或 OS 问题并不是一回事……您可以一个接一个地捕获特定的异常。

try:
    XXX
except TYPE:
    YYY
except TYPE:
    ZZZ
于 2012-05-15T06:58:36.363 回答