第一次调用gen.throw()再调用print(next(gen))返回yied 3

来源:12-7 生成器进阶-send、close和throw方法

qq_未来在哪_0

2018-11-01

图片描述
请教下老师,这里不应该是返回2吗?三个yied,第一次调用next()再调用gen.throw()捕获第一个yied的异常,再调用next(gen)不应该返回2吗?为什么是3?

写回答

3回答

bobby

2019-02-13

throw方法。它的实现手段是通过向生成器对象在下次被挂起处,抛出一个异常。之后会继续执行生成器对象中后面的语句,直至遇到下一个yield语句返回,我们来理解一下这句话:

    里面最重要的信息是 "生成器对象在上次被挂起处"

当我们第一次调用 next(gen)之后就会print出url,然后就会挂起,当调用gen.throw之后会驱动gen继续执行到下一个yield 2处,所以gen.throw已经驱动生成器执行了,所以当你再次调用next的时候会直接执行到yield 3 了

1
1
我是阿物
print(gen.throw(Exception, "download error")) 会打印 2
2019-05-09
共1条回复

wireless_ZDJ

2019-02-12

对呀,我也是一模一样的疑问?为什么是3呢?

代码就是老师自己的代码,讲课的时候也是3

0
0

bobby

2018-11-03

你把代码贴出来 我在本地运行一下试试

0
0

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程