Генератор Python, исключение без проглатывания в 'сопрограмме'

Недавно я обнаружил удивительное поведение в генераторах 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, где за исключением не принимает исключения?

12
задан EoghanM 22 October 2010 в 13:55
поделиться