Python 3.x can';我不理解协同程序中的generator.throw()
我正在读《流畅的python》一书中关于协同程序的章节,但不理解其中的一些要点 生成器.抛出(exc_类型[,exc_值[,回溯]]) 导致生成器暂停的产量表达式引发异常 鉴于如果异常由生成器处理,则流将前进到下一个 yield,并且生成的值成为generator.throw调用的值。如果 异常不由生成器处理,它会传播到调用方的上下文 有人能帮我解释一下课文是粗体的吗Python 3.x can';我不理解协同程序中的generator.throw(),python-3.x,Python 3.x,我正在读《流畅的python》一书中关于协同程序的章节,但不理解其中的一些要点 生成器.抛出(exc_类型[,exc_值[,回溯]]) 导致生成器暂停的产量表达式引发异常 鉴于如果异常由生成器处理,则流将前进到下一个 yield,并且生成的值成为generator.throw调用的值。如果 异常不由生成器处理,它会传播到调用方的上下文 有人能帮我解释一下课文是粗体的吗 class DemoException(Exception): """An exception type for the
class DemoException(Exception):
"""An exception type for the demonstration."""
def demo_exc_handling():
print('-> coroutine started')
while True:
try:
x = yield
except DemoException:
print('*** DemoException handled. Continuing...')
else:
print('-> coroutine received: {!r}'.format(x))
raise RuntimeError('This line should never run.')
看起来你遗漏了一些代码
if __name__=="__main__":
z = demo_exc_handling()
print(z.__next__()) # arrives at yield
x = z.throw(DemoException())
print(x)
这意味着,z.throw()将使生成器处理异常,继续循环,并返回收益率的下一个值。如果我们修改代码以实际返回一个值,我们可以看到
def demo_exc_handling():
print('-> coroutine started')
i = 0
while True:
i += 1
try:
x = yield i
except DemoException:
print('*** DemoException handled. Continuing...')
else:
print('-> coroutine received: {!r}'.format(x))
raise RuntimeError('This line should never run.')
当我们运行第一部分时,您应该看到
-> coroutine started
1
*** DemoException handled. Continuing...
2
处理了generator.throw,循环继续,返回了2,因为它是下一个屈服值