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

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

  1. def myGenerator():
  2. try:
  3. yield 1
  4. except GeneratorExit:
  5. print "myGenerator exited"
  6. gen = myGenerator()
  7. print gen.next()
def myGenerator():
try:
yield 1
except GeneratorExit:
print "myGenerator exited" gen = myGenerator()
print gen.next()

输出结果为

  1. 1
  2. myGenerator exited
1
myGenerator exited

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

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

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

输出结果

  1. 1
  2. myGenerator exited
  3. Main caller exited
1
myGenerator exited
Main caller exited

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

  1. def myGenerator():
  2. try:
  3. yield 1
  4. yield 2
  5. except GeneratorExit:
  6. print "myGenerator exited"
  7. gen = myGenerator()
  8. del gen
  9. print "Main caller exited"
def myGenerator():
try:
yield 1
yield 2
except GeneratorExit:
print "myGenerator exited" gen = myGenerator()
del gen
print "Main caller exited"

其输出结果如下:

  1. Main caller exited
Main caller exited

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

转载:python异常之 GeneratorExit的更多相关文章

  1. [转载]python异常如何全面捕获

    写在前面:最近写python程序,进场遇到异常的问题,因此需要捕获异常.查阅了下资料,整理如下: 常见的异常处理的方法: 假设有下面的一段程序: try:     语句1     语句2     . ...

  2. python 异常

    引用一段来自菜鸟教程的文章:http://www.runoob.com/python/python-exceptions.html Python 异常处理 python提供了两个非常重要的功能来处理p ...

  3. #21 Python异常

    前言 运行程序时经常遇到各种错误,例如:ImportError(导入模块错误).IndexError(索引错误).NameError(变量错误).SyntaxError(语法错误).Indentati ...

  4. Python异常和异常处理

    Python异常和异常处理2017年12月20日 22:17:08 Megustas_JJC 阅读数:114 标签: python 异常处理 更多 个人分类: Python 版权声明:本文为博主原创文 ...

  5. [转载] Python数据类型知识点全解

    [转载] Python数据类型知识点全解 1.字符串 字符串常用功能 name = 'derek' print(name.capitalize()) #首字母大写 Derek print(name.c ...

  6. python 异常之进阶操作

    1.文件分析 下面来做一些文件分析操作,分析整本书的信息. 知识点: string.split():将字符串分解为列表. open(filename,‘rb’)或者open(filename,enco ...

  7. Python异常类型及包含关系

    Python异常类型及包含关系,设计异常捕获时参考: BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- ...

  8. python——异常except语句用法与引发异常

    except: #捕获所有异常 except: <异常名>: #捕获指定异常 except:<异常名1,异常名2):捕获异常1或者异常2 except:<异常名>,< ...

  9. 笔记-python异常信息输出

    笔记-python异常信息输出 1.      异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...

随机推荐

  1. 10Linux_firewalld-Linux就该这么学

    firewalld: runtime:当前生效,重启后失效(默认) permanent:当前不生效,重启后永久生效. A:重启,B:执行firewall-cmd --reload 数据链路层:ipta ...

  2. [Torch]提示torch.inverse错误

    来源:https://blog.csdn.net/zziahgf/article/details/72548128 当执行官方第二个例子时,提示xs = torch.inverse(A)*b错误 是因 ...

  3. CentOS安装svn(subversion)版本管理

    yum -y install subversion svnadmin create /svn/repository cd /svn/repository/conf ll  查看文件-rw-r--r-- ...

  4. 接口--Comparable接口【哈夫曼树】

    我们在字符串中见到过CompareTo方法,知道这个方法是用于比较字符串顺序的,根据字典顺序进行排序.Java中很多类也都有CompareTo方法,甚至于排序算法的底层组成也是依赖于比较的,而这个比较 ...

  5. cobbler登录web界面时出现“Internal Server Error”

    当进行cobbler配置后,并进行web登录时,出现错误: 先查看其日志位置 #cat /etc/httpd/conf.d/ssl.conf 在其中位置发现其错误的日志位置为/etc/httpd/lo ...

  6. vue keep-alive 原理

    前人种树:https://segmentfault.com/a/1190000011978825 add : 使用 keep-alive 组件后,组件生命周期会新引入两个钩子

  7. OrderBy排序和IComparer的使用

    https://www.cnblogs.com/May-day/p/7490334.html 一,OrderBy排序在MDSN中有两种使用方法,如下 1>第一种方法的使用,就是根据某个字段排序, ...

  8. python 打开文件基础 (笔记)

    1.打开文件:建立文件与程序的关联 open(filenname,mode) filenname:文件名(包括路径):mode :打开模式 模式 打开模式 含义 r 只读,文件不存在则报错 w 只写, ...

  9. Unity4.3.4 安装出现 pattern not found

    第一次破解不成功,第二次破解的时候就会出现这个错误 删除C:\ProgramData\Unity里面文件后,再重启后点击Manual Activation,出现的对话框是是保存当前序列号?重新加载序列 ...

  10. Autowried注解和Resource注解的区别

    目录 1.概述 2.Autowried 3.Resource 4.总结 1.概述 在使用Spring框架的过程中, 依赖注入是必须的, 大多时候会使用Autowried注解来进行依赖注入, 但是也可以 ...