我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python中终止协程和异常处理方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python中终止协程和异常处理方式

协程中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用方(即触发协程的对 象)。

下面示例举例说明如何使用之前博客示例中由装饰器定义的 averager 协程。

未处理的异常会导致协程终止

"""
预激协程的装饰器

"""


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))

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python中终止协程和异常处理方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python中终止协程和异常处理方式

这篇文章主要介绍了python中终止协程和异常处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-16

python终止协程和异常处理的方法是什么

本文小编为大家详细介绍“python终止协程和异常处理的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“python终止协程和异常处理的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。协程中未处
2023-07-04

Python的异常处理方式

这篇文章主要介绍“Python的异常处理方式”,在日常操作中,相信很多人在Python的异常处理方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的异常处理方式”的疑惑有所帮助!接下来,请跟着小编
2023-06-04

协程在Linux中的异常处理机制

在Linux中,协程的异常处理机制主要依赖于操作系统的信号机制。当协程发生异常时,可以通过设置信号处理函数来处理异常情况。例如,可以使用sigaction()函数来注册一个信号处理函数,当协程发生异常时,操作系统会向该协程发送一个信号,然后
协程在Linux中的异常处理机制
2024-08-08

Python常见异常的处理方式浅析

异常指当程序出现错误后程序的处理方法,异常机制提供了程序正常退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器,如序列的下标越界、打开不存在的文件、空引用异常等
2023-02-21

kotlin协程异常处理的方法是什么

Kotlin协程的异常处理方法有以下几种:1. 使用try/catch块:在协程内部使用try/catch块来捕获异常,并对异常进行处理。例如:```kotlinGlobalScope.launch {try {// 协程代码块} catc
2023-09-20

Python常见异常的处理方式是什么

这篇文章主要介绍“Python常见异常的处理方式是什么”,在日常操作中,相信很多人在Python常见异常的处理方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python常见异常的处理方式是什么”的疑
2023-07-05

盘点URLError和HTTPError异常处理方式

一、前言本文主要说URLError 还有 HTTPError,以及一些处理方式。二、URLError1. 解释下 URLError 可能产生的3个原因:# 1. 网络无连接,即本机无法上网。# 2. 连接不到特定的服务器。# 3. 服务器不
2023-07-25

Python之异常值检测和处理方式是什么

这篇文章主要讲解了“Python之异常值检测和处理方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python之异常值检测和处理方式是什么”吧!1 什么是异常值?在机器学习中,异常检
2023-07-02

interrupt()和线程终止方式_动力节点Java学院整理

中断线程线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否
2023-05-31

python中with和异常处理实例分析

这篇“python中with和异常处理实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python中with和异常处理
2023-06-27

Python中处理异常的方法是什么

在Python中处理异常的方法是使用try-except语句。try块中包含可能会抛出异常的代码,而except块中包含处理异常的代码。例如:try:# 可能会抛出异常的代码result = 10 / 0except ZeroDivis
Python中处理异常的方法是什么
2024-03-12

python中异常报错处理方法汇总

首先异常是什么,异常白话解释就是不正常,程序里面一般是指程序员输入的格式不规范,或者需求的参数类型不对应,不全等等。 Python中异常是指程序中的例外,违例情况。异常机制是指程序出现错误后,程序的处理方法。当出现错误后,程序的执行流程发生
2022-06-04

python中异常处理的方法是什么

Python中的异常处理方法是使用`try-except`语句块来捕获和处理异常。以下是一些常见的异常处理方法:1. 使用`try-except`语句块捕获指定类型的异常:```pythontry:# 可能会引发异常的代码...except
2023-08-08

Python中的异常处理方法是什么

这篇文章主要介绍“Python中的异常处理方法是什么”,在日常操作中,相信很多人在Python中的异常处理方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中的异常处理方法是什么”的疑惑有所
2023-07-06

实例介绍java中异常的处理方式

首先处理异常主要有两种方式:一种try catch,一种是throws。一、try catchtry{} 中放入可能发生异常的代码。catch{}中放入对捕获到异常之后的处理。其中catch中e.printStackTrace()作用就是,在控制台打印程序出错
实例介绍java中异常的处理方式
2016-10-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录