广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python终止协程和异常处理的方法是什么
  • 103
分享到

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

2023-07-04 20:07:14 103人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

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

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

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

"""预激协程的装饰器"""from inspect import getgeneratorstatefrom functools import wrapsdef coroutine(func):    """装饰器:向前执行到第一个`yield`表达式,预激`func`"""    # 把被装饰的生成器函数替换成这里的 primer 函数;    # 调用 primer 函数时,返回预激后的 生成器。    @wraps(func)    def primer(*args, **kwargs):        # 调用被装饰的函数,获取生成器对象。        gen = func(*args, **kwargs)        # 预激生成器。        next(gen)        # 返回生成器。        return gen    return primer@coroutinedef averager():    total = 0.0    count = 0    average = None    while True:        term = yield average        total += term        count += 1        average = total / countif __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 getgeneratorstateclass 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终止协程和异常处理的方法是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网Python频道。

--结束END--

本文标题: python终止协程和异常处理的方法是什么

本文链接: https://www.lsjlt.com/news/347166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • python终止协程和异常处理的方法是什么
    本文小编为大家详细介绍“python终止协程和异常处理的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“python终止协程和异常处理的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。协程中未处...
    99+
    2023-07-04
  • python中终止协程和异常处理方式
    目录未处理的异常会导致协程终止下面举例说明总结协程中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用方(即触发协程的对 象)。 下面示例举例说明如何使用之前博客示...
    99+
    2022-12-16
    python终止协程 python异常处理 python协程
  • kotlin协程异常处理的方法是什么
    Kotlin协程的异常处理方法有以下几种:1. 使用try/catch块:在协程内部使用try/catch块来捕获异常,并对异常进行...
    99+
    2023-09-20
    kotlin
  • python终止线程的方法是什么
    Python 中终止线程的方法有以下几种:1. 使用标志位:在线程内部使用一个标志位来控制线程是否继续执行。当标志位为 False ...
    99+
    2023-09-25
    python
  • Python异常捕获和处理的方法是什么
    1 | 语法错误指解析代码时出现的错误。当代码不符合Python 语法规则时,Python解释器在解析时就会报出 SyntaxError 语法错误,与此同时还会明确指出最早探测到错误的语句。例如:print "Hello,Worl...
    99+
    2023-05-23
    Python
  • Python中的异常处理方法是什么
    这篇文章主要介绍“Python中的异常处理方法是什么”,在日常操作中,相信很多人在Python中的异常处理方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中的异常处理方法是什么”的疑惑有所...
    99+
    2023-07-06
  • python中异常处理的方法是什么
    Python中的异常处理方法是使用`try-except`语句块来捕获和处理异常。以下是一些常见的异常处理方法:1. 使用`try-...
    99+
    2023-08-08
    python
  • Dos下终止进程的方法是什么
    这篇文章主要介绍“Dos下终止进程的方法是什么”,在日常操作中,相信很多人在Dos下终止进程的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Dos下终止进程的方法是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-09
  • Python基础教程之异常处理的方法是什么
    这篇文章主要介绍“Python基础教程之异常处理的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python基础教程之异常处理的方法是什么”文章能帮助大家解决问题。异常在Python中,使...
    99+
    2023-07-05
  • Python永久存储和异常处理的方法是什么
    本篇内容介绍了“Python永久存储和异常处理的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  Python之永久存储(pick...
    99+
    2023-06-01
  • idea终止程序运行的方法是什么
    在大多数编程语言中,可以使用以下方法之一来终止程序的运行:1. 使用`exit()`函数或`System.exit()`方法:这将立...
    99+
    2023-10-09
    idea
  • Scala异常处理的方法是什么
    这篇文章主要介绍“Scala异常处理的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Scala异常处理的方法是什么”文章能帮助大家解决问题。Scala异常处理Scala是一种多范式的编程语...
    99+
    2023-07-05
  • Python常见异常的处理方式是什么
    这篇文章主要介绍“Python常见异常的处理方式是什么”,在日常操作中,相信很多人在Python常见异常的处理方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python常见异常的处理方式是什么”的疑...
    99+
    2023-07-05
  • Scala异常处理方法是什么
    这篇“Scala异常处理方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Scala异常处理方法是什么”文章吧。Sca...
    99+
    2023-06-27
  • JS异常抛出和处理的方法是什么
    今天小编给大家分享一下JS异常抛出和处理的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。抛出异常在 js 中,有时...
    99+
    2023-07-04
  • Java异常处理的的方法是什么
    本篇内容主要讲解“Java异常处理的的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java异常处理的的方法是什么”吧!1) 为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。...
    99+
    2023-06-16
  • MySQL存储过程异常处理的方法是什么
    MySQL存储过程可以通过以下方法进行异常处理: 使用DECLARE语句声明一个异常变量,然后使用HANDLER语句来处理异常。例...
    99+
    2023-10-25
    MySQL
  • springboot全局异常处理的方法是什么
    在Spring Boot中,可以使用`@ControllerAdvice`和`@ExceptionHandler`注解来实现全局异常...
    99+
    2023-10-07
    springboot
  • java项目异常处理的方法是什么
    在Java项目中,有多种方法可以处理异常,包括:1. try-catch块:使用try-catch块可以捕获并处理异常。在try块中...
    99+
    2023-09-16
    java
  • Springboot统一异常处理的方法是什么
    Spring Boot提供了一个全局异常处理的方法,可以通过编写一个`@ControllerAdvice`注解的类来实现统一异常处理...
    99+
    2023-08-09
    Springboot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作