02生成器的close與throw方法

def gen_01():
    print('gen_01--before y1--')
    y1=yield 'yield_y1'
    print('gen_01--after y1:{}--'.format(y1))

    print('gen_01--before y2--')
    y2=yield 'yield_y2'
    print('gen_01--after y2:{}--'.format(y2))

    return 'jet'


def main_01():
    gen=gen_01()
    s1=gen.send(None) #預激生成器
    print('main_01-gen-s1:{}'.format(s1))
    print('main_01-gen.close()')
    gen.close()
    print('main_01-gen-s2 start')
    s2=gen.send(None)
'''
執(zhí)行:
    main_01()
輸出結(jié)果:
    gen_01--before y1--
        預激生成器后,程序從調(diào)用者main_01切換到生成器代碼色瘩,
        生成器代碼執(zhí)行到第一個yield 手蝎,然后將yield 右邊的值傳遞給調(diào)用者main,程序切換到調(diào)用者main執(zhí)行
    main_01-gen-s1:yield_y1
    main_01-gen.close()
        調(diào)用者main接受生成器傳遞過來的參數(shù),然后繼續(xù)執(zhí)行到close 
    main_01-gen-s2 start
        調(diào)用者main執(zhí)行send座韵,代碼跳轉(zhuǎn)到生成器
     
    Traceback (most recent call last):
      File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 45, in <module>
        main_01()
      File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 18, in main_01
        s2=gen.send(None)
    StopIteration
        生成器產(chǎn)生StopInteration并向上拋出换薄,表示生成器執(zhí)行完成,接盤俠調(diào)用者main負責處理
'''
def main_02():
    gen=gen_01()
    s1=gen.send(None) #預激生成器
    print('main_01-gen-s1:{}'.format(s1))
    print('main_01-gen.close()')
    gen.close()

    try:
        gen.send(None)
    except StopIteration as e:
        print('----:{} -'.format(e))
'''
執(zhí)行:
    main_02()
輸出結(jié)果:
    gen_01--before y1--
    main_01-gen-s1:yield_y1
    main_01-gen.close()
        由此可見close就關(guān)閉生成器暮刃,任何接下來的send或者next都會導致StopInteration,
        而且這個StopInteration并不會包含生成器return的值
'''

def gen_03():
    print('gen_01--before y1--')
    y1=yield 'yield_y1'
    print('gen_01--after y1:{}--'.format(y1))

    print('gen_01--before y2--')
    y2=yield 'yield_y2'
    print('gen_01--after y2:{}--'.format(y2))

    return 'jet'

def main_03():
    gen=gen_03()
    s1=gen.send(None) #預激生成器
    print('main_03-s1:{}'.format(s1))
    gen.throw(Exception,'happy error!')

'''
調(diào)用
    main_03
執(zhí)行結(jié)果:
    gen_01--before y1--
        生成器向調(diào)用者返回yield右邊的值,卡在第一個yield,程序跳回調(diào)用者main
    main_03-s1:yield_y1
        調(diào)用者main接受生成器傳遞過來的數(shù)據(jù)帆疟,并繼續(xù)往下執(zhí)行鹉究,直到執(zhí)行到throw
    Traceback (most recent call last):
      File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 82, in <module>
        main_03()
      File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 79, in main_03
        gen.throw(Exception,'happy error!')
      File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 66, in gen_03
        y1=yield 'yield_y1'
    Exception: happy error!
        生成器中卡住的yiled那里(第一個yield那里)并沒有處理異常的代碼,所以我們造的異常還是拋給了調(diào)用者接盤俠main函數(shù) 
'''

def gen_04():
    print('gen_04--before y1--')
    try:
        y1 = yield 'yield_y1'
    except Exception as e:
        print('一個來的調(diào)用者的異常:{}'.format(e))
        y1='Sorry'
    print('gen_04--after y1:{}--'.format(y1))

    print('gen_04--before y2--')
    y2 = yield 'yield_y2'
    print('gen_04--after y2:{}--'.format(y2))

    return 'jet'

def main_04():
    gen = gen_04()
    s1 = gen.send(None)  # 預激生成器
    print('main_04-s1:{}'.format(s1))
    s2=gen.throw(Exception, 'happy error!')
    print('main_04-s2:{}'.format(s2))
'''
執(zhí)行:
    main_04
執(zhí)行結(jié)果:
    gen_04--before y1--
    main_04-s1:yield_y1
    
    一個來的調(diào)用者的異常:happy error!  #由于我們處理完了異常踪宠,生成器一直執(zhí)行到第二個yield,然后生成器將第二個yield右邊的值返回給調(diào)用者main
    gen_04--after y1:Sorry--
    gen_04--before y2--
    
    main_04-s2:yield_y2  #程序跳回調(diào)用者main,調(diào)用者main接受參數(shù)并繼續(xù)執(zhí)行
'''
'''
以上就是我們向生成器拋出異常的流程
其實和我們向生成器send數(shù)據(jù)的時機是一樣的自赔,都是在yield卡主切換到調(diào)用者,調(diào)用者向生成器傳遞柳琢,
與send不同的是绍妨,send傳遞值,然后程序切換到生成器代碼柬脸,生成器代碼在卡住的yield位置接受值并繼續(xù)往下執(zhí)行
而throw傳遞異常,然后程序切換到生成器代碼他去,生成器代碼在卡住的yield位置捕獲異常然后處理并繼續(xù)往下執(zhí)行
'''
'''
利用生成器對外跑出異常,我們可以讓生成器提前結(jié)束
'''
def gen_05():
    print('gen_05--before y1--')
    try:
        y1 = yield 'yield_y1'
    except Exception as e:
        print('一個來的調(diào)用者的異常:{},我們接下來跑出StopIteration向上拋出'.format(e))
        raise StopIteration()
    print('gen_05--after y1:{}--'.format(y1))

    print('gen_05--before y2--')
    y2 = yield 'yield_y2'
    print('gen_05--after y2:{}--'.format(y2))

    return 'jet'

def main_05():
    gen = gen_05()
    s1 = gen.send(None)  # 預激生成器
    print('main_05-s1:{}'.format(s1))
    try:
        s2=gen.throw(Exception, 'happy error!')
    except:
        print("生成器 拋出StopInteration后倒堕,程序跳轉(zhuǎn)到調(diào)用者main--")

    print('main_05:繼續(xù)調(diào)用send方法測試下生成器有沒有結(jié)束')
    try:
        s3=gen.send('戳一戳')
    except StopIteration as e:
        print('main_01 獲取拋車異常StopInteration:{} -'.format(e))
    else:
        print('main_01  s3:{}'.format(s3))
"""
由此可見灾测,當生成器主動拋出StopInteration異常,也能讓生成器提前結(jié)束垦巴,媳搪,,
"""


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骤宣,一起剝皮案震驚了整個濱河市秦爆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憔披,老刑警劉巖鲜结,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異活逆,居然都是意外死亡,警方通過查閱死者的電腦和手機拗胜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門蔗候,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埂软,你說我怎么就攤上這事锈遥∪沂拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵所灸,是天一觀的道長丽惶。 經(jīng)常有香客問我,道長爬立,這世上最難降的妖魔是什么钾唬? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮侠驯,結(jié)果婚禮上抡秆,老公的妹妹穿的比我還像新娘。我一直安慰自己吟策,他們只是感情好儒士,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檩坚,像睡著了一般着撩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匾委,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天拖叙,我揣著相機與錄音,去河邊找鬼剩檀。 笑死憋沿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沪猴。 我是一名探鬼主播辐啄,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼运嗜!你這毒婦竟也來了壶辜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤担租,失蹤者是張志新(化名)和其女友劉穎砸民,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奋救,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡岭参,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尝艘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片演侯。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖背亥,靈堂內(nèi)的尸體忽然破棺而出秒际,到底是詐尸還是另有隱情悬赏,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布娄徊,位于F島的核電站闽颇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寄锐。R本人自食惡果不足惜兵多,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锐峭。 院中可真熱鬧中鼠,春花似錦、人聲如沸沿癞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椎扬。三九已至惫搏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚕涤,已是汗流浹背筐赔。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揖铜,地道東北人茴丰。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像天吓,于是被迫代替她去往敵國和親贿肩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容