转载地址 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. flask sqlchemy 多对多的自引用关系定义

    多对多的定义可以使用关联表,或者重新定义一个模型,通过模型定义多对多的自引用在flask web开发书里有讲到,这里主要演示用关联表定义的方法. from flask_sqlalchemy impor ...

  2. Python相关文章

    1.一台计算机如何安装2个版本的python,互不影响呢 2.Eclipse和PyDev搭建完美Python开发环境(Windows篇) 3.基于官方教程的matplotlib简介

  3. [RUNOOB]C++继承

    REF: http://www.runoob.com/cplusplus/cpp-inheritance.html 一.基类和派生类 程序: #include "stdafx.h" ...

  4. 在CentOS6.9 x86下编译libusb-1.0.22遇到的两个问题

    OS版本:CentOS 6.9 x86,内核版本2.6.32 问题一:configure.ac:36: error: Autoconf version 2.69 or higher is requir ...

  5. Ubuntu上部署tomcat后无法访问8080端口问题

    在tomacat的bin目录下,修改startup.sh文件,添加信息: #set java environment export JAVA_HOME=/usr/java/jdk1.8.0_111 e ...

  6. ES6 Promise 用法转载

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  7. 定位篇align_measurements

    算子:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metr ...

  8. python的django基础篇

    一.Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站! Django的特点: 强大的数据库功能:拥有强大的数据库操作接口(QueryS ...

  9. springboot日志logback配置

    <?xml version="1.0" encoding="UTF-8"?> <!-- scan:当此属性设置为true时,配置文件如果发生改 ...

  10. BurpSuite抓HTTPS包

    Burp Suite要抓HTTPS的包的话,是需要有Burp Suite的CA证书的 为什么要证书这里就不说了,下面是具体步骤 1.首先要把Burp Suite的CA证书下载到本地 Burp Suit ...