91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python終止協程和異常處理的方法是什么

發布時間:2022-12-17 09:27:59 來源:億速云 閱讀:113 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“python終止協程和異常處理的方法是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“python終止協程和異常處理的方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

協程中未處理的異常會向上冒泡,傳給 next 函數或 send 方法的調用方(即觸發協程的對 象)。

未處理的異常會導致協程終止

"""
預激協程的裝飾器

"""


from inspect import getgeneratorstate
from functools import wraps


def coroutine(func):
    """裝飾器:向前執行到第一個`yield`表達式,預激`func`"""

    # 把被裝飾的生成器函數替換成這里的 primer 函數;
    # 調用 primer 函數時,返回預激后的 生成器。
    @wraps(func)
    def primer(*args, **kwargs):
        # 調用被裝飾的函數,獲取生成器對象。
        gen = func(*args, **kwargs)
        # 預激生成器。
        next(gen)
        # 返回生成器。
        return gen

    return primer


@coroutine
def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield average
        total += term
        count += 1
        average = total / count


if __name__ == '__main__':
    coro_avg = averager()
    # print(getgeneratorstate(coro_avg))
    print(coro_avg.send(10))
    print(coro_avg.send(30))
    # 發送的值不是數字,導致協程內部有異常拋出。
    print(coro_avg.send('spam'))
    # 由于在協程內沒有處理異常,協程會終止。
    # 如果試圖重新激活協程,會拋出 StopIteration 異常。
    print(coro_avg.send(60))

上面示例,暗示了終止協程的一種方式:發送某個哨符值,讓協程退出。內置的 None 和 Ellipsis 等常量經常用作哨符值。Ellipsis 的優點是,數據流中不太常有這個值。我還見 過有人把 StopIteration 類(類本身,而不是實例,也不拋出)作為哨符值;也就是說, 是像這樣使用的:my_coro.send(StopIteration)。

從 Python 2.5 開始,客戶代碼可以在生成器對象上調用兩個方法,顯式地把異常發給協程。

這兩個方法是 throw 和 close。

generator.throw(exc_type[, exc_value[, traceback]])

致使生成器在暫停的 yield 表達式處拋出指定的異常。

如果生成器處理了拋出的異常,代碼會向前執行到下一個 yield 表達式,而產出的值會成為調用 generator.throw 方法 得到的返回值。

如果生成器沒有處理拋出的異常,異常會向上冒泡,傳到調用方的上下 文中。

generator.close()

致使生成器在暫停的yield 表達式處拋出GeneratorExit 異常。

如果生成器沒有處 理這個異常,或者拋出了StopIteration 異常(通常是指運行到結尾),調用方不會 報錯。

如果收到GeneratorExit 異常,生成器一定不能產出值,否則解釋器會拋出 RuntimeError 異常。

生成器拋出的其他異常會向上冒泡,傳給調用方。

下面舉例說明

如何使用 close 和 throw 方法控制協程:

"""
學習在協程中處理異常的測試代碼
"""
from inspect import getgeneratorstate

class DemoException(Exception):
    """為這次演示定義的異常類型。"""

def demo_exc_handling():
    print('-> coroutine started')
    try:
        while True:
            try:
                x = yield
            #  特別處理 DemoException 異常
            except DemoException:
                print('*** DemoException handled. Continuing...')
            # 如果沒有異常,那么顯示接收到的值。
            else:
                print('-> coroutine received: {!r}'.format(x))
    finally:
        # 如果不管協程如何結束都想做些清理工作,
        # 要把協程定義體中相關的代碼放入try/ finally 塊中
        print('-> coroutine ending')

if __name__ == '__main__':
    exc_coro = demo_exc_handling()
    next(exc_coro)
    exc_coro.send(11)
    exc_coro.send(22)
    # 激活和關閉 demo_exc_handling,沒有異常
    # exc_coro.close()

    # 如果把 DemoException 異常傳入 demo_exc_handling 協程,
    # 它會處理,然后繼續運行
    # exc_coro.throw(DemoException)
    # exc_coro.send(33)

    # 如果無法處理傳入的異常,協程會終止
    exc_coro.throw(ZeroDivisionError)

    print(getgeneratorstate(exc_coro))

讀到這里,這篇“python終止協程和異常處理的方法是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黑河市| 司法| 瑞金市| 武义县| 闽侯县| 大足县| 晋城| 集贤县| 烟台市| 界首市| 介休市| 尼勒克县| 曲阳县| 平凉市| 南康市| 涿鹿县| 开远市| 明光市| 扎兰屯市| 衡水市| 利川市| 延庆县| 景德镇市| 元朗区| 杭锦后旗| 涟源市| 比如县| 虹口区| 慈利县| 达孜县| 拜泉县| 邵武市| 苏州市| 磴口县| 孟村| 绿春县| 通城县| 泸州市| 淄博市| 洪泽县| 达日县|