为什么Bare-Except被淹没的原因

Ale*_*agh 4 python python-2.7

在一种有限的方式中,我想知道为什么在Python中使用裸露的东西是如此不受欢迎.

如果我有一个完整的程序运行,我会这样做:

import sys
from application import program
try:
    program.start()
except:
    print >> sys.stderr, "It didn't work"
Run Code Online (Sandbox Code Playgroud)

我正在压制重要信息并且没有真正的输出.但是让我们考虑我正在为配置设置进行IO操作,如果配置不存在或已损坏,我有一组模板要使用:

import os
from config import load_data
from template import save_data

dir = os.path.expanduser('~')
path = os.path.join(dir, 'config.txt')
try:
    load_data(path)
except:
    save_data(path)
Run Code Online (Sandbox Code Playgroud)

我想在这种情况下,构建一个捕获操作的自定义异常是否更好,以便为阅读代码的人提供更多信息?

小智 8

你的例子是一个很好的例子,说明为什么这是一个坏主意.您的程序不是"如果数据不存在或已损坏,则使用模板覆盖它".您的程序是"如果出现任何问题,请尝试使用模板覆盖数据".

例如,如果您在尝试加载数据时执行的代码中存在拼写错误,则程序将不会通知您,而是使用模板覆盖所有(有效!)数据.这可能是一个相当灾难性的错误,无论是在数据丢失方面,还是你可以轻易地说服自己这可能不是问题,如果错误发生在你的测试用例错过的不经常运行的代码路径中.

出现问题的另一个例子是用户是否决定尝试用Ctrl+ 中止程序C.你会抓住KeyboardInterrupt并迅速破坏他的所有数据.

  • 顺便说一句,我强烈建议不要试图在过低的水平上进行错误处理; 进行某种初始化的例程可能没有足够的知识来了解任何应用程序可能想要使用它来知道错误会发生什么*,并且几乎肯定没有足够的知识来知道`sys.exit`是对错误的适当回应.(当然,这个一般原则也有例外,但你应该确定*在你这样做之前你真的处于其中一个例外) (2认同)