#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.