не могу понять generator.throw() в сопрограмме

#python-3.x

#python-3.x

Вопрос:

Я читаю книгу «fluent python» в главе сопрограммы, но не могу понять некоторые моменты,

generator.throw(exc_type[, exc_value[, traceback]]) Вызывает выражение 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.')
  

Ответ №1:

Похоже, вы пропустили какой-то код.

 if __name__=="__main__":
    z = demo_exc_handling()
    print(z.__next__()) # arrives at yield
    x = z.throw(DemoException())
    print(x)
  

Это означает, что z.throw() заставит генератор обработать исключение, продолжить цикл и вернуть следующее значение yield. Если мы изменим код, чтобы фактически возвращать значение, мы сможем это увидеть.

 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, потому что это следующее значение yield.