try except 和编程礼仪
我正在制作一个图形用户界面(GUI),发现自己使用了很多 try except 语句。我的问题是,我是否应该重新设计我的程序,以减少 try except 语句的使用,还是说在 Python 程序中使用 try except 是一种好习惯?我喜欢它们,因为它们提供了很多信息,让我调试起来更简单。我只是想知道真正的开发者对此有什么看法。
谢谢
相关问题:
3 个回答
2
很难给出一个普遍的答案来说明你应该减少异常处理的使用... 你确实可以做得太多,也可以做得太少。捕获所有可能的异常几乎肯定是错误的,而完全不处理异常也几乎肯定是错误的。
这里有一些需要考虑的事项:
- 如果你能通过编程的方式处理错误情况,通常捕获异常是个好主意。例如,你的代码在尝试发起一个网络请求,如果失败了,你可能想要重试。在这种情况下,你需要捕获异常,然后进行重试。
- 仔细考虑在哪里捕获异常。在一些低级的函数中,你能合理地处理这个错误吗?比如,假设你有一个写文件的函数,它因为权限问题失败了。在这里你可能无能为力,但在更高层次上,你可以捕获这个异常,并向用户显示一条消息,告诉他们尝试将文件保存到其他地方。
- 几乎没有必要捕获“致命”的错误类型,比如内存不足、栈溢出等。至少在代码的低层次上不应该这样做——在顶层处理这些错误,尝试优雅地退出可能更有意义。
- 不要“吞掉”那些应该被上层捕获的异常,也就是说,如果你的调用函数应该看到这个异常,就不要在except语句中处理后不再抛出异常。这可能会隐藏严重的bug。
想了解更多,可以在谷歌上搜索“异常处理指南”。你看到的很多结果可能是针对其他语言或环境的,但这些概念同样适用。
4
在决定是否要捕捉异常时,一个重要的考虑因素是你可能会隐藏哪些合法的错误。
比如,看看这段代码:
try:
name = person['name']
except KeyError:
name = '<none provided>'
如果person肯定是一个dict(字典),这样做是合理的……但是如果person可能是更复杂的东西,比如:
class Person(object):
def __getitem__(self, key):
return do_something(key)
那么你就有可能不小心捕捉到一个异常,而这个异常是由于一个真正的错误引起的(比如do_something里的一个bug)。
我觉得有必要提一下:你应该绝对不要(除非在一些非常特定的情况下)使用“裸”的except:。
我个人的偏好是尽量避免捕捉异常(比如,使用name = person.get('name', '<none provided>')),因为我觉得这样更简洁,而且我不喜欢try/catch块的样子。
7
Python有个很有名的说法:请求原谅比请求许可更简单。(可以看看Python的术语解释,特别是EAFP这部分)。
所以,用异常处理来安排程序的流程是完全可以的(而且相比其他语言,这种方式也相对快速)。我觉得这很符合Python灵活的特点。