Недавно я столкнулся с некоторым удивительным поведением в генераторах Python:
class YieldOne:
def __iter__(self):
try:
yield 1
except:
print '*Excepted Successfully*'
# raise
for i in YieldOne():
raise Exception('test exception')
, которое дает вывод:
*Excepted Successfully*
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: test exception
Я был (приятно) удивлен, что напечатано *Excepted Successfully*
,поскольку это было то, что я хотел, но также удивился, что Исключение все еще распространялось на верхний уровень.Я ожидал использовать ключевое слово * (1008 *) (прокомментированное в этом примере), чтобы получить наблюдаемое поведение.
Кто-нибудь может объяснить, почему эта функциональность работает так, как она работает, и почему except
в генераторене глотает исключение?
Это единственный экземпляр в Python, где except
не глотает исключение?