Je suis récemment tombé sur un comportement surprenant générateurs Python:générateur Python, exception non déglutition 'coroutine'
class YieldOne:
def __iter__(self):
try:
yield 1
except:
print '*Excepted Successfully*'
# raise
for i in YieldOne():
raise Exception('test exception')
Ce qui donne la sortie:
*Excepted Successfully*
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: test exception
J'étais (agréablement) surpris que *Excepted Successfully*
a été imprimé, comme c'était ce que je voulais, mais aussi surpris que l'Exception soit encore propagée au plus haut niveau. Je m'attendais à devoir utiliser le mot-clé raise
(commenté dans cet exemple) pour obtenir le comportement observé.
Quelqu'un peut-il expliquer pourquoi cette fonctionnalité fonctionne comme il le fait, et pourquoi le except
dans le générateur ne pas avaler l'exception?
Est-ce la seule instance en Python où un except
ne pas avaler une exception?
Aha, maintenant c'est logique. Au départ, je ne m'attendais pas à ce que l'exception soit propagée au générateur. – EoghanM
+1 très intéressant! – rubik
+1 pour illuminer le tour de 'generator.throw'! – EoghanM