尝试除了和编程礼仪

时间:2011-11-29 23:48:08

标签: python

我正在制作一个GUI,我发现自己要使用很多try except语句。我的问题是,我应该重新设计我的程序以使用较少的try except语句,还是try except在python程序中使用的好习惯?我喜欢他们,因为他们提供了丰富的信息,让我更容易调试。只是想知道真正的开发人员对它的看法。

由于

3 个答案:

答案 0 :(得分:7)

Python的一个习语是:It's easier to ask for forgiveness than for permission.(Python词汇表,看看EAFP)。

因此,使用异常处理来构建程序流是完全可以接受的(与其他语言相比,也相当快)。它非常符合Python的动态性质。

答案 1 :(得分:4)

在决定是否捕获异常时,一个重要的考虑因素是您可能隐藏的合法错误。

例如,请考虑以下代码:

try:
    name = person['name']
except KeyError:
    name = '<none provided>'

如果已知persondict,这是合理的......但如果person可能更复杂,例如:

class Person(object):
    def __getitem__(self, key):
        return do_something(key)

您冒着意外捕获由合法错误导致的异常的风险(例如,do_something中的错误)。

我觉得有必要提一下:你应该never, ever (except under a couple of very specific circumstances) use a "naked" except:

我个人的偏好是尽可能避免捕获异常(例如,使用name = person.get('name', '<none provided>')),因为我觉得它更干净而且我不喜欢try / catch块的外观。

答案 2 :(得分:2)

很难就是否应该使用较少的异常处理给出一般答案......你绝对可以做得太多而且太少。捕获每个可能的异常几乎肯定是错误的,并且几乎肯定错误的是不进行异常处理。

以下是需要考虑的一些事项:

  • 如果您可以以编程方式对错误条件执行某些操作,那么捕获异常通常是个好主意。例如。您的代码正在尝试发出Web请求,如果失败,则需要重试。在那种情况下,您希望捕获异常,然后重试。
  • 仔细考虑 where 以捕获异常。在某些低级功能中,你能合理地对错误做些什么吗?例如。假设您有一个写出文件的函数,但它失败并出现权限错误。可能你在那里做的不多,但也许在更高级别你可以捕获异常并向用户显示一条消息,指示他们尝试将文件保存在其他地方。
  • 捕获“致命”类型的错误几乎没有意义,例如内存不足,堆栈溢出等。至少代码不低 - 有一个尝试优雅退出的顶级处理程序可能是有意义的。
  • 不要“吞下”真正应该冒出的异常,即如果你的调用函数真的应该看到它,那么没有一个不会重新引发异常的except子句。这可以隐藏严重的错误。

有关更多信息,请在Google上搜索“异常处理指南”。您看到的许多结果将用于其他语言/环境,但这些概念也适用。