def gen():
try:
for i in range(5):
yield i
except Exception as e:
print('Caught: ' + str(e))
finally:
print('I am done')
for x in gen():
print(x)
if x == 2:
raise Exception('Catch me?')
0
1
2
I am done
Traceback (most recent call last):
File "test.py", line 13, in <module>
raise Exception('Catch me?')
Exception: Catch me?
为什么代码执行finally
子句但不执行except
子句?
请参考说明。
答案 0 :(得分:4)
生成器函数的主体只会在for
循环的迭代之间运行。也就是说,for
循环意味着:
只有第1步涉及在生成器函数中实际运行代码。由于生成器函数中try
块内的代码不会引发任何异常,因此except
子句无需捕获。执行finally
子句是因为它始终执行(finally
的用途是什么)。
在生成器上使用循环并不意味着整个循环体运行&#34;内部&#34;发电机功能。它只意味着从发电机一次抓取一个值,直到它耗尽。循环体仍在其自己的范围内执行,与生成器函数的范围分开。