Почему мы не можем отловить исключение Stopiteration в определенной функции генератора? - PullRequest
1 голос
/ 21 марта 2019
def simple_generator():
    print("-> start ..")
    try:
        x = yield
        print("-> receive {} ..".format(x))
    except StopIteration:
        print("simple_generator exit..")

Я знаю, что каждый вызов next объекта-генератора запускает код до следующего оператора yield и возвращает полученное значение. Если больше нечего получить, StopIteration повышается.

Итак, я хотел поймать StopIteration в функции simple_generator как код выше. Тогда я попробовал:

>>>
>>> sg3 = simple_generator()
>>> sg3.send(None)
-> start ..
>>> sg3.send("hello generator!")
-> receive hello generator! ..
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Это бросило StopIteration, в то время как try ...excep не уловило его вообще, я не мог понять, в чем причина, может кто-нибудь объяснить это? Заранее спасибо.

Конечно, я также знал, что если бы я имел дело с исключением StopIteration вне функции simple_generator, это сработало так, как я ожидал, например.

>>> try:
...     sg4 = simple_generator()
...     while True:
...         next(sg4)
... except StopIteration:
...     print("sg4 exit ..")
...
-> start ..
-> receive None ..
sg4 exit ..
>>>

Итак, мой вопрос Почему мы не смогли поймать исключение Stopiteration в определенной функцией генератора?

...