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