Recentemente ho sono imbattuto in alcuni comportamenti sorprendenti in Python generatori:generatore di Python, non deglutire eccezione nel 'coroutine'
class YieldOne:
def __iter__(self):
try:
yield 1
except:
print '*Excepted Successfully*'
# raise
for i in YieldOne():
raise Exception('test exception')
che fornisce l'output:
*Excepted Successfully*
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: test exception
Ero (piacevolmente) sorpreso che *Excepted Successfully*
è stato stampato, poiché era ciò che volevo, ma anche sorpreso che l'eccezione si fosse propagata fino al livello più alto. Mi aspettavo di dover utilizzare la parola chiave (commentato in questo esempio) raise
per ottenere il comportamento osservato.
qualcuno può spiegare il motivo per cui questa funzionalità funziona come lo fa, e perché il except
nel generatore non inghiottire l'eccezione?
È questa l'unica istanza in Python in cui uno except
non ingerisce un'eccezione?
Aha, ora ha senso. Inizialmente non mi aspettavo che l'eccezione si propagasse 'sopra' al generatore. – EoghanM
+1 molto interessante! – rubik
+1 per illuminare il trucco 'generator.throw'! – EoghanM