python 生成器的GeneratorExit异常
转载自: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异常的更多相关文章
- python 生成器等语法
生成器 调用生成器函数,不会执行生成器函数中的代码,而是返回一个对象, 这个对象是生成器(可用type()函数判断这个对象类型), 如果要运行生成器函数中的代码, 需要调用 next()方法, ...
- Python中出现的异常
简单的写几种我知道的关于Python中出现的异常含义,希望大神批评指正,我只是学软件开发的菜鸟,前面的路还很长,我会努力学习! 什么是异常? 异常既是一个事件,该事件会在程序执行过程中发生,影响了程序 ...
- python生成器(转)
生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法.生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是 ...
- python基础之内置异常对象
前言 什么叫异常?简单来说就是程序运行发生了预计结果之外的情况从而导致程序无法正常运行.而python解释器将一些常见的异常情况在它发生时打包成一个异常对象,我们可以通过捕捉这些异常对象从而进行处理, ...
- python 3.6.3 异常
内置异常 在Python中,所有异常都必须是派生类的实例 BaseException.在try同一个声明中except 说提到一类特殊条款,该条款还处理来自类(从中但也不例外类派生的任何异常类它派生) ...
- python所有的标准异常类:
异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 ...
- python所有的标准异常类
异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 ...
- python 中常见的异常类型汇总
异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 ...
- 第4.2节 神秘而强大的Python生成器精讲
一. 生成器(generator)概念 生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIte ...
随机推荐
- 做错的题目——this的指向
不管延不延时,setTimeout里面的function都是孤立的,并不属于哪一个对象,所以this只会指向全局
- qt: qt install framework使用问题;
qt提供了qt install framework用于程序打包,方便.快捷,并且可以对界面和功能进行自定义. 但是, 如果使用默认的打包配置,不进行安装页面功能自定义的话, 在修改安装路径时,在对程序 ...
- Java基础构造方法和this关键字整理
构造方法 8.1构造方法介绍 构造方法的格式: 修饰符 构造方法名(参数列表) { } l 构造方法的体现: n 构造方法没有返回值类型.也不需要写返回值.因为它是为构建对象的,对象创建完,方法就 ...
- 解决gitk显示文件内容中文乱码
解决gitk显示文件内容中文乱码 1.git config 命令 设置git gui的界面编码 git config --global gui.encoding utf-8 2.修改配置文件 在~\e ...
- Java Web之Http协议
为什么会出现HTTP协议?有什么用? 浏览器和服务器之间进行数据的沟通的时候,需要标准,浏览器有Chrome浏览器,火狐浏览器,IE浏览器等.服务器有Tomcat服务器,IIS服务器等,由于各自标准不 ...
- Linux环境变量总结
现在每天测试到时候会与Linux打交道,自然也会用到环境变量了.看了网上几篇文章,结合自己到实践和看法,总结以下Linux的环境变量吧.一.什么是环境变量?环境变量相当于给系统或用户应用程序设置的一些 ...
- STM32学习笔记:【003】GPIO
版本:STM32F429 Hal库v1.10 在STM32中,最常用到的功能莫过于GPIO(General Purpose Input Output .通用输入/输出)了,在STM32中,除了除去AD ...
- jQuery图片灯箱和视频灯箱
在一些前端页面中经常需要文件上传,为了美观,我们经常做一个灯箱来显示我们选择的文件, 而不是简单的input标签. html 代码:这个是多图片上传 <div class="layui ...
- mysql 常用的命令集合
1.创建表 CREATE TABLE `cardPcitrue`( `id` INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT'编号', `cId` IN ...
- bzoj千题计划312:bzoj2119: 股市的预测(后缀数组+st表)
https://www.lydsy.com/JudgeOnline/problem.php?id=2119 题意:将给定数组差分后,求ABA形式的字串个数,要求|B|=m,|A|>0 1.后缀数 ...