Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 776|回复: 0

python 生成器的GeneratorExit异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-10 22:16:53 | 显示全部楼层 |阅读模式

    转载自:https://blog.csdn.net/hedan2013/article/details/72810653

    当一个生成器对象被销毁时,会抛出一个GeneratorExit异常。请看下面的代码。

    def myGenerator():  
        try:
            yield 1
        except GeneratorExit:
            print ("aa")
     
    gen = myGenerator()
    print (next(gen))
    '''
    1
    aa
    '''

    执行过程:

    当调用next方法时,会激活生成器,直至遇到生成器方法的yield语句,返回值1。同时,生成器方法被挂起。然后打印1,此时主程序结束,系统会自动产生一个GeneratorExit异常,被生成器对象方法的Except语句块截获。

     

     

    而GeneratorExit异常产生的时机,是在生成器对象被销毁之前。为了验证这点,请看下面的代码。也就是说,系统在销毁一个生成器之前会先扔给生成器一个GeneratorExit异常

     

    def myGenerator():  
        try:
            yield 1
            yield 2
        except GeneratorExit:
            print ("aa")
    gen = myGenerator()
    print (next(gen))
    del gen#销毁生成器
    print ('bb')
    
    '''
    1
    aa
    bb
    '''

     

    值得一提的是,GeneratorExit异常只有在生成器对象被激活后,才有可能产生。更确切的说,需要至少调用一次生成器对象的next方法后,系统才会产生GeneratorExit异常。请看下面的代码。

     

    def myGenerator():  
        try:
            yield 1
            yield 2
        except GeneratorExit:
            print ('aa')
     
    gen = myGenerator()
    del gen
    print ('bb')
    '''
    bb
    '''

     

    在上面的示例中,我们都显式地捕获了GeneratorExit异常。如果该异常没有被显式捕获,生成器对象也不会把该异常向主程序抛出。因为GeneratorExit异常定义的初衷,是方便开发者在生成器对象调用结束后定义一些收尾的工作,如释放资源等。

    def myGenerator():  
        try:
            yield 1
            yield 2
        except NameError:
            print ('aa')
     
    gen = myGenerator()
    print (next(gen))
    del gen
    print ('bb')
    '''
    1
    bb
    '''

     

     

     

    以上就是全部知识点,下面再来分析一个例子:

    def myGenerator():  
        try:
            yield 1
            yield 2
        except GeneratorExit:
            print ("aa")
            yield
     
    gen = myGenerator()
    print (next(gen))
    del gen
    print ('bb')
    
    '''
    1
    aa
    Exception ignored in: <generator object myGenerator at 0xf54a1a50>
    RuntimeError: generator ignored GeneratorExit
    bb
    '''

    del gen这句,系统接到了销毁生成器的命令,在销毁之前,先扔给他一个GeneratorExit异常,这个异常被生成器捕获到,先打印aa,然后遇到了yield,这是生成器抛出RuntimeError异常(生成器正在消亡的过程中当然就不能迭代了),只不过主程序ignore了这个异常了,主程序不受影响接着执行

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 03:16 , Processed in 0.056946 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表