Недавно я встретил какое-то удивительное поведение в генераторах 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*
получил распечатку, так как это было то, что я хотел, но также удивился тому, что Exception до сих пор распространялся до верхнего уровня. Я ожидал использовать ключевое слово raise
(прокомментированное в этом примере), чтобы получить наблюдаемое поведение.
Может кто-нибудь объяснить, почему эта функция работает так, как она есть, и почему except
в генераторе не проглатывает исключение?
Является ли это единственным экземпляром в Python, где except
не проглатывает исключение?