抓住Python中所有异常的坏主意

Ban*_*oot 8 python exception-handling exception

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

据我所知,追赶使用的所有例外except:条款,甚至会搭上"特别"蟒蛇例外:SystemExit,KeyboardInterrupt,和GeneratorExit.那么为什么不使用一个except Exception:子句来捕获所有异常呢?

Raf*_*ler 21

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

所以,根据流行的要求,这是一个例子.一个程序员正在编写Python代码,她得到了一个IOError.她没有进一步调查,而是决定抓住所有例外情况:

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

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


mar*_*bdq 5

因为您可能希望以不同的方式处理每个异常。按键中断与编码问题或操作系统问题不是一回事……您可以一个接一个地捕获特定的异常。

try:
    XXX
except TYPE:
    YYY
except TYPE:
    ZZZ
Run Code Online (Sandbox Code Playgroud)