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

时间:2015-05-18 04:11:28

标签: python python-2.7

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

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

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

我正在压制重要信息并且没有真正的输出。但是让我们考虑我正在为配置设置进行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)

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

2 个答案:

答案 0 :(得分:8)

您的示例是一个精彩示例,说明为什么这是一个坏主意。您的程序不是"如果数据不存在或已损坏,请使用模板"覆盖它。您的程序是"如果一切都出错,请尝试使用模板覆盖数据"。

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

另一个出错的例子是,如果用户决定尝试使用 Ctrl + C 中止程序。你抓住了KeyboardInterrupt并迅速破坏了他的所有数据。

答案 1 :(得分:1)

说裸机是一个坏主意的原因之一是,根据Python或其可能的任何语言,任何迫使程序退出的事情都是例外。

示例,来自终端的Ctrl + C

因此,我们正在寻找导致程序关闭的特定类型的错误,并相应地执行操作。因此,指定要处理的异常类型有助于缩小实际原因并帮助您进行修正