Python 3.x can';我不理解协同程序中的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

我正在读《流畅的python》一书中关于协同程序的章节,但不理解其中的一些要点

生成器.抛出(exc_类型[,exc_值[,回溯]]) 导致生成器暂停的产量表达式引发异常 鉴于如果异常由生成器处理,则流将前进到下一个 yield,并且生成的值成为generator.throw调用的值。如果 异常不由生成器处理,它会传播到调用方的上下文

有人能帮我解释一下课文是粗体的吗

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,因为它是下一个屈服值