博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转载:python异常之 GeneratorExit
阅读量:5943 次
发布时间:2019-06-19

本文共 1678 字,大约阅读时间需要 5 分钟。

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

 

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

 

 

[python]
  1. def myGenerator():    
  2.     try:  
  3.         yield 1  
  4.     except GeneratorExit:  
  5.         print "myGenerator exited"  
  6.   
  7.   
  8.   
  9. gen = myGenerator()  
  10. print gen.next()  
def myGenerator():      try:        yield 1    except GeneratorExit:        print "myGenerator exited"gen = myGenerator()print gen.next()

输出结果为

 

 

[plain]
  1. 1  
  2. myGenerator exited  
1myGenerator exited

上面代码的运行逻辑如下: 当调用到gen.next()方法时,会执行生成器对象方法的yield语句。此后,主程序结束,系统会自动产生一个GeneratorExit异常,被生成器对象方法的Except语句块截获。

 

而GeneratorExit异常产生的时机,是在生成器对象被销毁之前。为了验证这点,请看下面的代码。

 

 

[python]
  1. def myGenerator():    
  2.     try:  
  3.         yield 1  
  4.         yield 2  
  5.     except GeneratorExit:  
  6.         print "myGenerator exited"  
  7.   
  8.   
  9.   
  10. gen = myGenerator()  
  11. print gen.next()  
  12. del gen  
  13. print "Main caller exited"  
def myGenerator():      try:        yield 1        yield 2    except GeneratorExit:        print "myGenerator exited"gen = myGenerator()print gen.next()del genprint "Main caller exited"

输出结果

 

[plain]
  1. 1  
  2. myGenerator exited  
  3. Main caller exited  
1myGenerator exitedMain caller exited

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

 

 

[python]
  1. def myGenerator():    
  2.     try:  
  3.         yield 1  
  4.         yield 2  
  5.     except GeneratorExit:  
  6.         print "myGenerator exited"  
  7.   
  8.   
  9.   
  10. gen = myGenerator()  
  11. del gen  
  12. print "Main caller exited"  
def myGenerator():      try:        yield 1        yield 2    except GeneratorExit:        print "myGenerator exited"gen = myGenerator()del genprint "Main caller exited"

其输出结果如下:

 

[plain]
  1. Main caller exited  
Main caller exited

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

 

转载于:https://www.cnblogs.com/pots/p/9081716.html

你可能感兴趣的文章
Server Tomcat v7.0 Server at localhost was unable to&nbs 报错问题解决
查看>>
Fiddler (三) Composer创建和发送HTTP Request
查看>>
C语言 多维数组和指针
查看>>
DotNetBar的使用—(界面风格)
查看>>
2.3系列系统中不支持SimpleDateFormat作字段被序列化
查看>>
DJANGO MODEL FORMSETS IN DETAIL AND THEIR ADVANCED USAGE
查看>>
ADO.NET复习——自己编写SqlHelper类
查看>>
库函数strlen源码重现及注意问题
查看>>
java读取数据,2,2,1方式读取
查看>>
《实例化需求》读书笔记
查看>>
正则表达式
查看>>
Springmvc ajax请求400
查看>>
HDFS集群安装部署
查看>>
WorkFlow For Net ! NET 平台工作流 或 BPM
查看>>
****Curling 2.0(深搜+回溯)
查看>>
小题目【链表1】
查看>>
常用Java8语法小结
查看>>
ZJOI2019 Day2 游记
查看>>
ccf题库中2015年12月2号消除类游戏
查看>>
WinForm窗体间如何传值
查看>>