Hace poco se encontró con un comportamiento extraño en los generadores de Python:generador de Python, no tragar excepción en 'corrutina'
class YieldOne:
def __iter__(self):
try:
yield 1
except:
print '*Excepted Successfully*'
# raise
for i in YieldOne():
raise Exception('test exception')
que da la salida:
*Excepted Successfully*
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: test exception
yo era (agradablemente) sorprendido que se imprimió *Excepted Successfully*
, ya que esto era lo que quería, pero también me sorprendió que la Excepción todavía se propagara al nivel superior. Esperaba tener que usar la palabra clave raise
(comentada en este ejemplo) para obtener el comportamiento observado.
¿Alguien puede explicar por qué esta funcionalidad funciona como lo hace, y por qué except
en el generador no se traga la excepción?
¿Es esta la única instancia en Python donde except
no traga una excepción?
Aha, ahora tiene sentido. Originalmente no esperaba que la excepción se propagara 'sobre' al generador. – EoghanM
+1 muy interesante! – rubik
+1 para iluminar el truco 'generator.throw' – EoghanM