【发布时间】:2018-11-13 06:58:37
【问题描述】:
我正在尝试在我的生成器中进行清理,但前提是循环体引发了异常,而不是使用 break 退出:
def f():
for v in [1,2,99,4]:
try:
yield v
except GeneratorExit:
# how to determine whether generator exited via an exception?
print("generator exited")
raise
但是,我还没有找到一种方法来区分迭代器中的break 和exception。
即以下代码
for v in f():
if v == 99:
break
将输出:
generator exited
还有这段代码
for v in f():
if v == 99:
raise Exception("boom")
将输出:
generator exited --------------------------------------------------------------------------- Exception: boom
所以从生成器的外部来看,差异是可以观察到的,但是我找不到在生成器主体内部观察到这一点的方法f()
【问题讨论】:
-
如果您创建Minimal, Complete, and Verifiable 示例,您将获得更多更好的答案。尤其要确保输入和预期的测试数据是完整的(不是伪数据),并且可以很容易地剪切和粘贴到编辑器中,以便测试建议的解决方案。
-
所以区别在于生成的是哪个值。 IE:从示例中
value == 99你为什么/如何期望生成器本身在这里识别差异? -
不同之处在于屈服体对值的反应。 IE。我的清理行为需要与生成器的退出是有意的还是异常的不同
-
我的直觉告诉我这是不可能的。你的异常被捕获并变成了一个
GeneratorExit,它不包含第一个异常的属性(例如e.args)。看来您需要修改源代码以保存GeneratorExit异常中的第一个异常的属性。
标签: python-3.x generator yield