throw有两方面的作用,首先是抛给生成器一个异常,然后如果生成器能处理掉异常的话,throw方法接着迭代一次取得返回值,
比如上面这个案例就抛给了生成器一个Exception异常,然后生成器处理掉了。注意,捕获异常是在上一次迭代中断的位置捕获,
因为每次生成器运行的时候,都是从上一次发生yield中断的地方开始运行,所以抛来的异常发生在这个地方,捕获当然也要在这个地方。
因为这个例子中异常被处理了,所以throw方法要完成他的第二张任务:让生成器迭代一次。于是,a为2
def gen_func(): try: yield 1 except Exception as e: pass yield 2 yield 3 yield 4 yield 5 return "bobby" if __name__ == "__main__": gen = gen_func() print(next(gen)) a=gen.throw(Exception, "download error") print (a)#2 print(next(gen))#注意,打印的是3不是2
close,他只有一个作用,就是像生成器抛出GeneratorExit异常。
def myGenerator(): try: yield 1 yield 2 except GeneratorExit: print ("aa") #yield 如果加上这句话,则生成器抛出runtimeerror,close与前面文章GeneratorExit的最后一个例子中的del不同,这个runtimeerror主程序不会忽略,主程序因此异常而退出 gen = myGenerator() print (next(gen)) gen.close() print ('bb') ''' aa bb '''
参考链接:https://www.cnblogs.com/saolv/p/9853645.html
def gen_func(): try: yield 1 except Exception as e: pass yield 2 yield 3 yield 4 yield 5 return "bobby"
if __name__ == "__main__": gen = gen_func() print(next(gen)) a=gen.throw(Exception, "download error") print (a)#2 print(next(gen))#注意,打印的是3不是2