栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

有时会显示异常TypeError警告,使用生成器的throw方法时有时不会显示

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

有时会显示异常TypeError警告,使用生成器的throw方法时有时不会显示

您会看到

__del__
某个地方的 钩子行为异常。

TypeError
而被抛出 关闭 ,如解释器正在退出一切被删除,并且在一个引发的任何异常Python的
__del__
解构钩被忽略了(但
打印的)。

在退出时,Python通过将所有内容重新绑定到来清除名称空间中的所有内容

None
,但是未设置发生这种情况的顺序。
a.close()
删除后,仍在运行的生成器将被关闭(称为),这会触发
GeneratorExit
生成器中的异常,Python会对您的
exceptMyException:
行进行测试。但是,如果
MyException
已经 被清理和Python看到
exceptNone:
TypeError
被抛出,你看到那个消息打印。

您可以通过添加以下命令来触发错误,而无需退出Python:

MyException = Nonedel a

如果您使用

list(a)
并使用了生成器的其余部分,或者
a.close()
在Python退出和删除之前使用显式关闭了生成器
MyException
,错误消息就会消失。

另一个解决方法是先处理

GeneratorExit

def gen():  for i in range(3):    try:      yield i    except GeneratorExit:      return    except MyException:      print("MyException!")

并且Python不会评估下一个

except
处理程序。

该错误无法在Python
3.2或更早版本中重现,因此看起来哈希随机化(在Python 3.3中引入)随机化了清除顺序对象;这肯定可以解释为什么只在 某些
运行中看到错误,而在哈希顺序固定的早期Python运行中却看不到错误。

请注意,

.__del__()
Python中的钩子与其他全局对象的交互在文档中以红色警告警告的形式进行了
.__del__()
说明:

警告
:由于在不稳定的情况下

__del__()
调用方法,在执行过程中发生的异常将被忽略,并显示警告
sys.stderr
。同样,当
__del__()
响应于模块被删除而被调用时(例如,当执行程序时),该
__del__()
方法引用的其他全局变量可能已经被删除或正在被拆除(例如,进口机械关闭)
)。为此原因,
__del__()
方法应做到维持外部不变性所需的绝对最小值。从版本1.5开始,Python保证在删除其他全局变量之前,将从其下划线开头的全局变量从其模块中删除。如果不存在对此类全局变量的其他引用,则这可能有助于确保在
__del__()
调用该方法时导入的模块仍然可用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/596525.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号