在 Python 中捕获所有异常的坏主意

Posted

技术标签:

【中文标题】在 Python 中捕获所有异常的坏主意【英文标题】:Bad idea to catch all exceptions in Python 【发布时间】:2012-05-22 13:46:24 【问题描述】:

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

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

【问题讨论】:

要把他们全部抓起来 我想最好在生产代码中捕获所有内容,但是随着软件的开发,它可能会使您的代码难以调试...... @jamylak: stephenvick.wordpress.com/2010/08/02/pokemon-exception-handling @VineetMenon 我认为,在生产代码中,您应该已经进行了足够的测试,以了解可能出现的所有特定异常并正确处理它们。 【参考方案1】:

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

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

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

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

【讨论】:

@Raffe:你能举出具体的例子吗? @Bandicoot 的具体示例说明为什么捕获所有异常不是一个好主意? @Raffe:是的。将帮助我更好地理解您的答案。谢谢! @Bandicoot 已更新。基本上,这个想法是异常是一种调试工具,当您捕获所有异常时会丢弃它,而不管它们实际上是什么。 如果在lines = f.readlins() 处出现拼写错误,它也会被异常静默捕获。底线 - 调试地狱【参考方案2】:

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

try:
    XXX
except TYPE:
    YYY
except TYPE:
    ZZZ

【讨论】:

以上是关于在 Python 中捕获所有异常的坏主意的主要内容,如果未能解决你的问题,请参考以下文章

python的异常处理

python中--try except 异常捕获以及正则化替换异常值

python—raise异常捕获

Python 异常处理-Python零基础入门教程

python常见异常和异常捕获

仅需6道题轻松掌握Python异常捕获 | Python技能树征题