1. 程式人生 > >生成器的throw和close方法

生成器的throw和close方法

發生 time runt next 一個 tails color .net 執行

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

throw有兩方面的作用,首先是拋給生成器一個異常,然後如果生成器能處理掉異常的話,throw方法接著叠代一次取得返回值,比如上面這個案例就拋給了生成器一個Exception異常,然後生成器處理掉了。註意,捕獲異常是在上一次叠代中斷的位置捕獲,因為每次生成器運行的時候,都是從上一次發生yield中斷的地方開始運行,所以拋來的異常發生在這個地方,捕獲當然也要在這個地方。因為這個例子中異常被處理了,所以throw方法要完成他的第二張任務:讓生成器叠代一次。於是,a為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 ‘‘‘

關於xlose,可參考

https://blog.csdn.net/hedan2013/article/details/72811117

的論述:

GeneratorExit異常的產生意味著生成器對象的生命周期已經結束。因此,一旦產生了GeneratorExit異常,生成器方法後續執行的語句中,不能再有yield語句,否則會產生RuntimeError。

生成器的throw和close方法