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 в определенной функцией генератора?