Python:在生成器中尝试…except…finally子句 代码 输出 0 1. 2. 我完了 回溯(最近一次呼叫最后一次): 文件“test.py”,第13行,在 引发异常(“抓到我了吗?”) 例外:抓住我? 问题:

Python:在生成器中尝试…except…finally子句 代码 输出 0 1. 2. 我完了 回溯(最近一次呼叫最后一次): 文件“test.py”,第13行,在 引发异常(“抓到我了吗?”) 例外:抓住我? 问题:,python,exception,generator,Python,Exception,Generator,为什么代码执行finally子句而不是except子句 请参考说明。生成器函数体仅在for循环的迭代之间运行。也就是说,for循环的含义如下: 从生成器获取下一个值 运行循环体 返回到步骤1 只有步骤1涉及在生成器函数中实际运行代码。由于生成器函数中的try块中的代码不会引发任何异常,因此except子句没有要捕获的内容。finally子句之所以执行,是因为它总是执行(这就是finally的作用) 在生成器上使用循环并不意味着整个循环体在生成器函数的“内部”运行。它只是意味着一次从生成器中获取一

为什么代码执行
finally
子句而不是
except
子句


请参考说明。

生成器函数体仅在
for
循环的
迭代之间运行。也就是说,for
循环的
含义如下:

  • 从生成器获取下一个值
  • 运行循环体
  • 返回到步骤1
  • 只有步骤1涉及在生成器函数中实际运行代码。由于生成器函数中的
    try
    块中的代码不会引发任何异常,因此
    except
    子句没有要捕获的内容。
    finally
    子句之所以执行,是因为它总是执行(这就是
    finally
    的作用)


    在生成器上使用循环并不意味着整个循环体在生成器函数的“内部”运行。它只是意味着一次从生成器中获取一个值,直到它耗尽为止。循环体仍然在自己的作用域中执行,与生成器函数的作用域分开。

    您在
    gen()
    函数外部引发异常,因此它不会捕获它。始终执行
    finally
    。因为无论代码是否失败,每次都执行
    finally
    (就像清理),并且您在生成器外部引发了异常,而不是在生成器内部,因此它不知道itTry-
    g=gen();g、 throw(ValueError)
    。因此,如果在具有
    finally
    子句的生成器之外引发异常,那么该子句何时运行?如果主函数使用多个生成器,每个生成器都有一个
    finally
    子句,该怎么办?他们是按什么顺序执行的?@Cyker:如果这是你的问题,你应该编辑你的问题来提问。当其
    try
    块中的代码完成时,将执行
    finally
    子句。如果您的生成器挂起在
    try
    块中,那么直到生成器关闭(如果有)之后,它的finally子句才会执行。
    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?