python:try..except ..发电机中的第一个子句



代码

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

请提供引用的解释。

生成器函数的正文仅在for循环的迭代之间运行。也就是说,for循环意味着:

  1. 从生成器获取下一个值
  2. 运行循环主体
  3. 回到步骤1

仅步骤1涉及在发电机函数内实际运行代码。由于生成器函数中的try块内部的代码不会引起任何异常,因此except子句无需捕获。finally子句执行,因为它始终执行(这就是finally的目的)。

在发电机上使用循环并不意味着整个循环主体在"内部"发电机函数中运行。它只是一次意味着一个值一次从发电机上抓住直到耗尽。循环主体仍在自己的范围中执行,与发电机函数的范围分开。

最新更新