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?