![]() |
1
3
简单地说,您可以从生成器中“调出上下文管理器”,只需更改3行即可获得:
一个上下文管理器,它还可以充当迭代器——并捕获调用方代码异常,如valueerror。 |
![]() |
2
3
最基本的问题是你试图使用
当生成器本身被删除时,将引发GeneratorExit异常,在对其进行垃圾收集时会发生这种情况。一旦异常发生,
换句话说,流程是这样的:
最后一步直到 之后 您的上下文管理器已经看到generatorexit。当我运行你的代码时,我看到valueerror出现了 之后 打印日志消息。 您可以看到垃圾回收正在工作,因为如果您创建对迭代器本身的另一个引用,它将使迭代器保持活动状态,因此不会对其进行垃圾回收,因此不会发生generatorexit。也就是说,这个“有效”:
结果是valueerror会传播并可见;不会发生generatorexit,也不会记录任何内容。您似乎认为generatorexit在某种程度上“掩盖”了您的valueerror,但它并不是真的;它只是一个通过不保留对迭代器的任何其他引用而引入的工件。在您的示例中,generatorexit立即发生的事实甚至不能保证行为;有可能在将来的某个未知时间之前,迭代器不会被垃圾收集,然后generatorexit将在该时间被记录下来。
在谈到“为什么我看到generatorexit”这个更大的问题时,答案是这是generator函数中实际发生的唯一异常。valueerror发生在生成器外部,因此生成器无法捕获它。这意味着你的代码不能以你想要的方式工作。你的
|
![]() |
3
1
这个
用途:
注意还有一个例外
里面
发电机本身,如前所述
我们也可以滥用这个事实,看看我们是否可以通过吞咽
注意如何有一个内部
因为上下文管理器将按原样捕获所有异常,而上下文管理器是
里面
生成器函数,它内部引发的任何异常都将简单地传递给
修改
运行生成的代码:
相同的
|
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Henry · 使用Python将json重新格式化为键值对 2 年前 |
![]() |
eymentakak · json字典类型错误:字符串索引必须是整数 2 年前 |
![]() |
Qubix · 从熊猫数据帧创建相对熵矩阵 2 年前 |
![]() |
guiguilecodeur · 如何删除我的词汇表中的重复元素 2 年前 |
![]() |
Susheel P M · 这是关于if-else语句[关闭] 2 年前 |
![]() |
Slartibartfast · 关于Python版本安装 2 年前 |