Su python2.6
immagino, vi aspettate il blocco finally di essere legato con il blocco "provare" in cui si alza l'eccezione "B". Il blocco finally è collegato al primo blocco "try".
Se è stato aggiunto un blocco tranne nel blocco try interna, poi il blocco finally solleverà eccezione B.
try:
raise Exception("a")
except:
try:
raise Exception("b")
except:
pass
finally:
raise
uscita:
Traceback (most recent call last):
File "test.py", line 5, in <module>
raise Exception("b")
Exception: b
Un'altra variazione che spiega che cosa sta accadendo qui
try:
raise Exception("a")
except:
try:
raise Exception("b")
except:
raise
Uscita:
Traceback (most recent call last):
File "test.py", line 7, in <module>
raise Exception("b")
Exception: b
Se si vede qui, sostituendo il blocco finally con eccezione solleva l'eccezione B.
Python 3.1 solleva entrambi. – kennytm
Ah. Avrei dovuto dire che sono su Python 2.6. – wilhelmtell
Solo per curiosità: il compilatore C# sulla stessa combinazione dice "Errore: un'istruzione throw senza argomenti non è consentita in una clausola finally che è annidata all'interno della clausola catch più vicina" (throw == raise, catch == tranne). Nessuna ambiguità! – Andrey