Python:尝试...除了......生成器中的finally子句

时间:2016-12-25 04:22:31

标签: python exception generator

代码

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子句?

请参考说明。

1 个答案:

答案 0 :(得分:4)

生成器函数的主体只会在for循环的迭代之间运行。也就是说,for循环意味着:

  1. 从发电机获取下一个值
  2. 运行循环体
  3. 返回第1步
  4. 只有第1步涉及在生成器函数中实际运行代码。由于生成器函数中try块内的代码不会引发任何异常,因此except子句无需捕获。执行finally子句是因为它始终执行(finally的用途是什么)。

    在生成器上使用循环并不意味着整个循环体运行&#34;内部&#34;发电机功能。它只意味着从发电机一次抓取一个值,直到它耗尽。循环体仍在其自己的范围内执行,与生成器函数的范围分开。