因为结束生成器不是一个常见事件(我知道它会一直发生,但只会发生 一次 )。抛出异常被认为是昂贵的。如果某个事件将在99%的时间内成功完成而在1%的时间内失败,那么使用try / except可能比检查是否可以访问该数据要快得多(要求宽恕比允许容易)。
由于使用这样的try / except块可能很难理解,因此也存在一些偏见。流量控制可能很难遵循,而if / else更简单。try / except意味着您必须在try 和 调用的函数内部跟踪语句的流控制(因为它们可能会引发异常,并且可能向上传播。if/ else只能在以下位置分支:语句被评估。
有时使用try / except是正确的,而使用if / else更有意义。它们每个都有性能成本。考虑:
a = <some dictionary>
if key in a:
print a[key]
与
a = <some dictionary>
try:
print a[key]
except KeyError:
pass
如果key在a内不存在,则第一个会变快,如果存在,则只会稍慢(几乎不明显)。如果键确实存在,则第二个将更快,但如果不存在,则第二个将慢得多。如果密钥几乎总是存在,则选择第二个。否则,第一个效果更好。
编辑:只需添加一点有关Python try / except的知识,就可以极大地解决可读性问题之一。
考虑从文件中读取。
f = None
try:
f = open(filename, 'r')
... do stuff to the file ...
except (IOError, OSError):
# I can never remember which one of these Python throws...
... handle exception ...
finally:
if f:
f.close()
现在,容器中的任何东西都do stuff to the file
可能引发异常,我们将抓住它。通常,由于这个原因,您尝试在尝试中保留尽可能少的代码。Pythonelse
为try提供了一个可选的子句,只有在try运行完成而没有遇到异常的情况下,该子句才会运行。
f = None
try:
f = open(filename, 'r')
except (IOError, OSError):
pass
else:
... do stuff to the file ...
finally:
if f:
f.close()