当前位置: 首页 > wzjs >正文

网站页面上的下载功能怎么做做网络平台的网站

网站页面上的下载功能怎么做,做网络平台的网站,龙岗网络公司,珠海网站建设小程序终止协程和异常处理 协程中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用 方(即触发协程的对象)。示例 16-7 举例说明如何使用示例 16-6 中由 装饰器定义的 averager 协程。 示例 16-7 未处理的异常会导致协程终止 >>>…

终止协程和异常处理

协程中未处理的异常会向上冒泡,传给 next 函数或 send 方法的调用
方(即触发协程的对象)。示例 16-7 举例说明如何使用示例 16-6 中由
装饰器定义的 averager 协程。

示例 16-7 未处理的异常会导致协程终止

>>> from coroaverager1 import averager
>>> coro_avg = averager()
>>> coro_avg.send(40) # ➊
40.0
>>> coro_avg.send(50)
45.0
>>> coro_avg.send('spam') # ➋
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for +=: 'float' and 'str'
>>> coro_avg.send(60) # ➌
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

❶ 使用 @coroutine 装饰器装饰的 averager 协程,可以立即开始发送
值。
❷ 发送的值不是数字,导致协程内部有异常抛出。
❸ 由于在协程内没有处理异常,协程会终止。如果试图重新激活协
程,会抛出 StopIteration 异常。
出错的原因是,发送给协程的 ‘spam’ 值不能加到 total 变量上。

示例 16-7 暗示了终止协程的一种方式:发送某个哨符值,让协程退
出。内置的 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 方法控制协程。示例 16-8 列出
的是接下来的例子使用的 demo_exc_handling 函数。
示例 16-8 coro_exc_demo.py:学习在协程中处理异常的测试代码

class DemoException(Exception):
"""为这次演示定义的异常类型。"""def demo_exc_handling():print('-> coroutine started')while True:try:x = yieldexcept DemoException:print('*** DemoException handled. Continuing...')else:print('-> coroutine received: {!r}'.format(x))
raise RuntimeError('This line should never run.')

❶ 特别处理 DemoException 异常。
❷ 如果没有异常,那么显示接收到的值。
❸ 这一行永远不会执行。

示例 16-8 中的最后一行代码不会执行,因为只有未处理的异常才会中
止那个无限循环,而一旦出现未处理的异常,协程会立即终止。

demo_exc_handling 函数的常规用法如示例 16-9 所示。
示例 16-9 激活和关闭 demo_exc_handling,没有异常

>>> exc_coro = demo_exc_handling()
>>> next(exc_coro)
-> coroutine started
>>> exc_coro.send(11)
-> coroutine received: 11
>>> exc_coro.send(22)
-> coroutine received: 22
>>> exc_coro.close()
>>> from inspect import getgeneratorstate
>>> getgeneratorstate(exc_coro)
'GEN_CLOSED'

如果把 DemoException 异常传入 demo_exc_handling 协程,它会处
理,然后继续运行,如示例 16-10 所示。

示例 16-10 把 DemoException 异常传入 demo_exc_handling 不
会导致协程中止

>>> exc_coro = demo_exc_handling()
>>> next(exc_coro)
-> coroutine started
>>> exc_coro.send(11)
-> coroutine received: 11
>>> exc_coro.throw(DemoException)
*** DemoException handled. Continuing...
>>> getgeneratorstate(exc_coro)
'GEN_SUSPENDED'

但是,如果传入协程的异常没有处理,协程会停止,即状态变成
‘GEN_CLOSED’。示例 16-11 演示了这种情况。

示例 16-11 如果无法处理传入的异常,协程会终止

>>> exc_coro = demo_exc_handling()
>>> next(exc_coro)
-> coroutine started
>>> exc_coro.send(11)
-> coroutine received: 11
>>> exc_coro.throw(ZeroDivisionError)
Traceback (most recent call last):
...
ZeroDivisionError
>>> getgeneratorstate(exc_coro)
'GEN_CLOSED'

如果不管协程如何结束都想做些清理工作,要把协程定义体中相关的代
码放入 try/finally 块中,如示例 16-12。

示例 16-12 coro_finally_demo.py:使用 try/finally 块在协程终
止时执行操作

class DemoException(Exception):
"""为这次演示定义的异常类型。"""def demo_finally():print('-> coroutine started')try:while True:try:x = yieldexcept DemoException:print('*** DemoException handled. Continuing...')else:print('-> coroutine received: {!r}'.format(x))finally:print('-> coroutine ending')

Python 3.3 引入 yield from 结构的主要原因之一与把异常传入嵌套的
协程有关。另一个原因是让协程更方便地返回值。请继续往下读,了解
详情。

http://www.dtcms.com/wzjs/800556.html

相关文章:

  • 搭建一个网站 优帮云企业网站建设优化
  • 网站的footer怎么做怎么建自己的网址
  • 做网站咋赚钱惠安县道安办网站建设
  • 网站建设运营公司wordpress 共用数据库
  • 郑州网站搜索排名济南网站建设开发公司哪家好
  • 石家庄网络推广建站做网站备案须知
  • 做机械设计图纸找什么网站网站开发外包价格
  • 网站怎么营销郑州cms建站模板
  • 手机微信网站怎么做的好处html代码规范
  • 宝安-网站建设信科网络wordpress 后台 字数统计
  • 网站建设的技术体会网站设计模板怎么使用
  • 北京市住房建设投资建设网站门户类网站备案
  • 网站建设两年免费维护网站 短链接怎么做
  • 哪些网站可以做易拉宝加利弗设计公司
  • 网站建设开发招标书网站优化排名哪家好
  • 免费俄语网站制作模板网站建设明细报价表
  • 网站建设简介是什么合作社网站建设
  • 最优的锦州网站建设网站建设找朝云科技
  • 门户网站 cms中英企业网站源码
  • 网站建设会销h5免费制作平台不用注册
  • 学做网站看书会了吗广州网站建设骏域网站
  • 腾讯云网站安全认证如何建立wordpress商城
  • 重庆网站制作公司黄金网站
  • 弹幕怎么做视频网站厦门建模培训
  • 新加坡的网站域名wordpress装百度联盟广告
  • 地方门户网站设计新公司注册详细流程
  • 做网站在线在西部数码做的企业网站不能与阿里巴巴网站相连接
  • 技术支持:佛山网站建设汕头高端网站开发
  • 做的烂的网站网站图片倒计时怎么做的
  • 免费个人网站怎么制作国外seo网站