Python生成器异常处理 正如PEP 479中概述(https://www.python.org/dev/peps/pep-0479/),开发了一段时间的一处变更旨在让人们更容易调试Python生成器引发的...在Python 3.7中,生成器引发StopIteration异常后,StopIteration异常将被转换成RuntimeError异常,那样它不会悄悄一路影响应用程序的堆栈框架。...这意味着如何处理生成器的行为方面不太敏锐的一些程序会在Python 3.7中抛出RuntimeError。...更好的解决方案是重新考虑如何构建生成器――比如说,使用return语句来终止生成器,而不是手动引发StopIteration。...Python importlib资源 importlib模块现在可用来读取“资源”,即随Python应用程序一并交付的二进制工件,比如数据文件。
i) 1 1 2 3 5 8 13 21 34 55 协程 历史历程 3.4引入协程,用yield实现 3.5引入协程语法 实现的协程比较好的包有asyncio,tornado,gevent 定义:协程...yield from 调用协程为了得到返回值,协程必须正常终止 生成器正常终止会发出StopIteration异常,异常对象的vlaue属性保存返回值 yield from从内部捕获StopIterator...5. coroutine.send(None) 终止 averager 子生成器,子生成器抛出 StopIteration 异常并将返回的数据包含在异常对象的 value 中,yield from 可以直接抓取..._get_running_loop() is not None: 528 raise RuntimeError( RuntimeError: This event loop..._get_running_loop() is not None: 528 raise RuntimeError( RuntimeError: This event loop
except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close() >>>> python...chmod -w testfile >>>> python test.py //输出如下 Error: 没有找到文件或读取文件失败 使用except不带任何异常 try: 正常的操作...finally: print "Error: 没有找到文件或读取文件失败" >>>> python test.py //输出如下,提前将testfile设为不可写 Error: 没有找到文件或读取文件失败...finally: print "关闭文件" fh.close() except IOError: print "Error: 没有找到文件或读取文件失败" >>>...StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError
上下文管理器其实是with语句,这是为了简化try/finally模式,这可以保证一段代码在运行完之后,即使出现错误也能正确的运行。...最常见的例子就是打开文件。...as语句只不过是把值绑定到了目标变量,as语句是可选的,但是如果是打开文件或者是连接数据库,则必须绑定获得句柄。...if a StopIteration exception # was passed to throw() and later wrapped into a RuntimeError...,保存生成器对象,如上所述是,next(self.gen),调用到yield关键字所在的位置,返回这个值绑定到as后面的变量。
,或者引发另外的一个异常,那么该异常会传播给调用者) 为generator-iterators 添加了一个新的方法close(), 在生成器暂停的位置引发一个GeneratorExit 异常,如果一个生成器引发了...StopIteration 异常或者GeneratorExit 异常, close()方法将返回给它的调用者,如果生成是yield 一个值,会引发RuntimeError 异常。...如果一个生成器引发了任何其他异常,则会传给他的调用者 ,如果生成器,由于异常退出或者已经正常退出,那么close()不执行任何操作。...,那么throw()将会引发传递相同的异常,如果生成器引发了另外一个异常,throw调用将引发异常,总之throw()的行为类似next()或者send() 除了它在挂起的时候引发异常。...如果生成器没有处理这个异常,或者抛出了StopIteration异常,调用方不会报错,如果收到GeneratorExit异常,生成器一定不能产出值,否则解释器会抛出RuntimeError异常。
因为generator保存的是算法,每次调用next(),就计算出下一个元素的值,知道计算到最后一个元素,没有更多的元素时,抛出Stopiteration的错误。...之后会继续执行生成器对象中后面的语句,知道遇到下一个yield语句返回。如果在生成器对象方法执行完毕后,依然没有遇到yield语句,跑出StopIteration异常。...因此,一旦产生了GeneratorExit异常,生成器方法后续执行的语句中,不能再有yield语句,否则会产生RuntimeError。...def reader(): # 模拟从文件读取数据的生成器 for i in range(4): yield '***{}***'.format(i) def reader_wrapper...(协程)传送数据 def writer(): # 读取send传进的数据,并模拟写进套接字或文件 while True: w = (yield) #w接收send传进的数据
yield 一个值,直到函数迭代器结束并抛出 StopIteration。...这里 for 其实相当于不断地调用 next 并处理 StopIteration c = countdown(3) # next(c) 3 # next(c) 2 # next(c) 1 把生成器当作管道...这时仅允许 return,如果没有捕捉这个错误,生成器会静默关闭,不抛出错误。...0 1 抛出错误 调用生成器的 throw 方法可以在 yield 处抛出某个特定类型的错误,如果生成器内部可以捕捉这个错误,那生成器将前进到下个 yield 语句处,并将产出值作为 throw 的返回值..., '运行错误')) apple 捕捉到: 运行错误 banana 生成器返回值 如果在生成器函数中加上 return 那在运行到 return 时将会把返回值作为 StopIteration 的值传递出去
StopIteration迭代器没有更多的值GeneratorExit生成器(generator)发生异常来通知退出StandardError所有的内建标准异常的基类ArithmeticError所有数值计算错误的基类...except IOError: print "Error: 没有找到文件或读取文件失败"else: print "内容写入文件成功" fh.close()Output:--------...except IOError: print "Error: 没有找到文件或读取文件失败"else: print "内容写入文件成功" fh.close()在执行代码前为了测试方便,我们可以先去掉...finally: print "Error: 没有找到文件或读取文件失败"如果打开的文件没有可写权限,输出如下所示:$ python test.py Error: 没有找到文件或读取文件失败同样的例子也可以写成如下方式...以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。
StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError...except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close() 以上程序输出结果:...,我们可以先去掉 testfile 文件的写权限,命令如下: chmod -w testfile 再执行以上代码: $ python test.py Error: 没有找到文件或读取文件失败 ----...finally: print "Error: 没有找到文件或读取文件失败" 如果打开的文件没有可写权限,输出如下所示: $ python test.py Error: 没有找到文件或读取文件失败...finally: print "关闭文件" fh.close() except IOError: print "Error: 没有找到文件或读取文件失败" 当在
我们在操作一个文件时,代码可以这么写: # 打开文件 f = open('file.txt') for line in f: # 读取文件内容 执行其他操作 # do_something...... # 关闭文件 f.close() 这个例子非常简单,就是打开一个文件,然后读取文件中的内容,最后关闭文件释放资源。...但是,代码这么写会有一个问题:在打开文件后,如果要对读取到的内容进行其他操作,在这操作期间发生了异常,这就会导致文件句柄无法被释放,进而导致资源的泄露。 如何解决这个问题?...回到最开始我们讲的,使用 with 读取文件的例子。...代码会运行生成器方法的 yield 处 return next(self.gen) except StopIteration: raise
在错误发生时进行处理 ```python '''语法: try: 可能发生异常错误的代码 except: 如果发生异常则进入 except 代码块进行处理 ''' # 假设读取的文件不存在...可以在文件读取前先判断当前的文件是否存在 # 2。也可以使用try 。。。 except。。在错误发生时进行处理 try: with open('....IndexError as e: #如果引发了非指定的异常,则无法处理 print(e) # 2。... | | StopIteration | 迭代器没有更多的值 | | GeneratorExit... | 生成器(generator)发生异常来通知退出 | | StandardError | 所有的内建标准异常的基类
在错误发生时进行处理 ```python '''语法: try: 可能发生异常错误的代码 except: 如果发生异常则进入 except 代码块进行处理 ''' # 假设读取的文件不存在...可以在文件读取前先判断当前的文件是否存在 # 2。也可以使用try 。。。 except。。在错误发生时进行处理 try: with open('....IndexError as e: #如果引发了非指定的异常,则无法处理 print(e) # 2。...| | StopIteration | 迭代器没有更多的值 | | GeneratorExit...| 生成器(generator)发生异常来通知退出 | | StandardError | 所有的内建标准异常的基类
上面结果是意料之中的,生成器实现了迭代协议,因此可以迭代,但由于越界抛出StopIteration。...当然如果此时函数中只有一个yield,你执行完后再次使用send方法就会报StopIteration错误,这是很明显的错误。...这里总结一下:当生成器调用close方法后,若其中包含未执行的含yield代码,则程序会在gen.close()处报RuntimeError: generator ignored GeneratorExit...错误;若其中不包含未执行的含yield代码,则程序会在next(gen)处报StopIteration错误(前提是继续执行了next(gen))。...发现了么,此时只会在next(gen)处报StopIteration错误;而不会在gen.close()处报RuntimeError: generator ignored GeneratorExit错误
摘要 随着互联网和连接程序的增长,引发了对响应性和可扩展代码的需求,该提议的目标是让我们共容易的通过编写显示异步,高并发的python代码并且更加Pythonic 它提出把写成的概念独立出来,并引入新的支持语法...协程不再抛出StopIteration异常,因为抛出的StopIteration异常会被包装(wrap)成一个RuntimeError异常。...在使用async with时,如果上下文管理器没有__aenter__和__aexit__方法,则会引发错误。在async def函数之外使用async with则会引发SyntaxError异常。...RuntimeError。...此外,根据PEP 479,协程抛出的所有StopIteration异常都会被包装成RuntimeError异常。
语法:以下为简单的try....except...else的语法:try: #运行别的代码except : #如果在try部份引发了'name'异常except...,: #如果引发了'name'异常,获得附加的数据else: #如果没有异常发生python标准异常----异常名称描述BaseException...所有异常的基类SystemExit解释器请求退出KeyboardInterrupt用户中断执行(通常是输入^C)Exception常规错误的基类StopIteration迭代器没有更多的值GeneratorExit...生成器(generator)发生异常来通知退出StandardError所有的内建标准异常的基类ArithmeticError所有数值计算错误的基类FloatingPointError浮点计算错误OverflowError...访问未初始化的本地变量ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象RuntimeError一般的运行时错误NotImplementedError尚未实现的方法
StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError...except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close() 以上程序输出结果: $ python test.py...except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close() 在执行代码前为了测试方便,我们可以先去掉 testfile...finally: print "Error: 没有找到文件或读取文件失败" 如果打开的文件没有可写权限,输出如下所示: $ python test.py Error: 没有找到文件或读取文件失败 同样的例子也可以写成如下方式...finally: print "关闭文件" fh.close() except IOError: print "Error: 没有找到文件或读取文件失败" 当在try块中抛出一个异常,立即执行finally
(如果生成器没有捕获传入的异常,或者它引发了其它异常,则该异常会传递给调用者。)...如果生成器产生一个值,则抛出 RuntimeError。如果生成器引发任何其它异常,也会传递给调用者。如果生成器已经退出(异常退出或正常退出),则 close() 不执行任何操作。...(可能是由于某种逻辑错误)。...(GeneratorExit, StopIteration): pass else: raise RuntimeError("generator ignored...我最初选择了 TypeError ,因为它表示生成器函数发生了严重的错误行为,应该通过修改代码来修复。
如果协程还未激活(GEN_CREATED 状态)要调用next(my_coro) 激活协程,也可以调用my_coro.send(None) 如果创建协程对象后立即把None之外的值发给它,会出现下述错误...in my_coro.send(123) TypeError: can't send non-None value to a just-started generator 仔细看错误消息...generator.close() 生成器在暂停的yield表达式处抛出GeneratorExit异常。 如果生成器没有处理这个异常或者抛出了StopIteration异常,调用方不会报错。...如果收到GeneratorExit异常,生成器一定不能产出值,否则解释器会抛出RuntimeError异常。 示例: 使用close和throw方法控制协程。...r}'.format(x)) raise RuntimeError('This line should never run.
(EOF)而没有读取任何数据时,引发 EOFError。...关闭生成器或协程时,将引发GeneratorExit异常。...,包括I / O故障(例如“找不到文件”或“磁盘已满”错误)时,将引发OSError异常。...它返回一个字符串,指示确切的错误。 异常StopIteration 内置函数next()和迭代器的__next __()方法引发StopIteration错误,以表示所有项目都是由迭代器产生的。...在import语句中或在调用内置函数exec()或eval()时,或在读取初始脚本或标准输入时,可能会发生语法错误。
StopIteration 迭代器没有更多的值 \ GeneratorExit 生成器(generator)发生异常来通知退出 \ StandardError 所有的内建标准异常的基类 \ ArithmeticError...\ IOError 输入/输出操作失败 如磁盘满了,输入文件不存在等等 OSError 操作系统错误 一个操作系统级别函数返回错误时会产生OSError WindowsError 系统调用失败 \ ImportError...一般的运行时错误 如果没有其他更特定的异常可用,就要使用RuntimeError异常 NotImplementedError 尚未实现的方法 用户自定义的基类可能产生NotImplementedError...语法: try: #运行别的代码 except : #如果在try部份引发了'name'异常 except ,: ...#如果引发了'name'异常,获得附加的数据 else: #如果没有异常发生 以下为简单的try....except...else的语法: try: int("aaa")
领取专属 10元无门槛券
手把手带您无忧上云