转载自: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了这个异常了,主程序不受影响接着执行

python 生成器的GeneratorExit异常的更多相关文章

  1. python 生成器等语法

    生成器 调用生成器函数,不会执行生成器函数中的代码,而是返回一个对象,  这个对象是生成器(可用type()函数判断这个对象类型),  如果要运行生成器函数中的代码, 需要调用 next()方法,   ...

  2. Python中出现的异常

    简单的写几种我知道的关于Python中出现的异常含义,希望大神批评指正,我只是学软件开发的菜鸟,前面的路还很长,我会努力学习! 什么是异常? 异常既是一个事件,该事件会在程序执行过程中发生,影响了程序 ...

  3. python生成器(转)

    生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法.生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是 ...

  4. python基础之内置异常对象

    前言 什么叫异常?简单来说就是程序运行发生了预计结果之外的情况从而导致程序无法正常运行.而python解释器将一些常见的异常情况在它发生时打包成一个异常对象,我们可以通过捕捉这些异常对象从而进行处理, ...

  5. python 3.6.3 异常

    内置异常 在Python中,所有异常都必须是派生类的实例 BaseException.在try同一个声明中except 说提到一类特殊条款,该条款还处理来自类(从中但也不例外类派生的任何异常类它派生) ...

  6. python所有的标准异常类:

    异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 ...

  7. python所有的标准异常类

    异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 ...

  8. python 中常见的异常类型汇总

    异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 ...

  9. 第4.2节 神秘而强大的Python生成器精讲

    一. 生成器(generator)概念 生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIte ...

随机推荐

  1. Redis高并发和快速的原因

    一.Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间:   3.redis使用多路复用技术,可以处理并发的连接 ...

  2. 【译】11. Java反射——动态代理

    原文地址:http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html 博主最近比较忙,争取每周翻译四篇.等不急的请移步原文网页. ...

  3. terminate called without an active exception异常

    在gcc4.4下,采用回调机制写了一个类似std::thread的线程类. 但是使用时却发生了核心已转移的错误. main函数调用的代码大致是 int main(int argc, char *arg ...

  4. Freemarker 的 Eclipse 插件 安装

    clipse版本(目前最新oxygen) 如果你的eclipse版本为Oxygen "Help" ---> "Eclipse Marketplace..." ...

  5. jQuery获取节点和子节点文本的方法

    本节主要介绍了jQuery如何获取节点和子节点文本,下面有个示例,大家可以参考下 对于下面的html片段, ? 1 <div id="text_test">test t ...

  6. jQuery中mouseleave和mouseout的区别详解

    很多人在使用jQuery实现鼠标悬停效果时,一般都会用到mouseover和mouseout这对事件.而在实现过程中,可能会出现一些不理想的状况. 先看下使用mouseout的效果: <p> ...

  7. linux umask使用方法

    A 什么是umask?   当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情.umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相 ...

  8. nginx根据cookie分流

    转载互联网 nginx根据cookie分流众所周知,nginx可以根据url path进行分流,殊不知对于cookie分流也很强大,同时这也是我上篇提到的小流量实验的基础. 二话不说,先看需求,两台服 ...

  9. python学习笔记--文件重命名,删除及文件夹

    文件重命名 import os os.rename('123.txt','456.txt') 删除文件 >>> import os >>> os.remove('4 ...

  10. mysql存储过程造数据取一个基准用户的各种类型都取一条数据作为基准数据,循环插入

    CREATE DEFINER=`user`@`%` PROCEDURE `create_upload_data`(in start_userid integer,in create_counter i ...