2015-02-24 8 views
6

Si consideri il seguente esempio minimale:Scope per "sollevare" senza argomenti a gestori di eccezioni nidificate in Python 2 e 3

try: 
    raise Exception('foo') 
except Exception: 
    try: 
    raise Exception('bar') 
    except Exception: 
    pass 
    raise 

L'esecuzione di questo codice con Python 2 solleva bar eccezione, in esecuzione con Python 3 solleva un'eccezione foo . Tuttavia, la documentazione sia per Python 2 e Python 3 afferma che raise senza espressione aumenterà "l'ultima eccezione che era attiva nell'ambito corrente". Perché l'ambito è diverso in Python 2 e 3? La differenza è documentata ovunque?

+0

È possibile visualizzare le modifiche 2.x vs. 3.x alle eccezioni su https://docs.python.org/3.0/whatsnew/3.0.html#changes-to-exceptions – jonrsharpe

+0

Grazie. Sembra che questo si riferisca alla pulizia implicita dei nomi delle eccezioni dai blocchi introdotti da PEP 3110 https://www.python.org/dev/peps/pep-3110/ e menzionati nella documentazione con una modifica tra 2 e 3: https : //docs.python.org/2/reference/compound_stmts.html#try https://docs.python.org/3/reference/compound_stmts.html#try. Eppure questo è incompleto al meglio, perché afferma che questo si applica solo alle eccezioni assegnate usando "come target". – a3nm

+1

Differenza di comportamento verificata in 2.7.9 e 3.4.3rc1. Puoi sollevare un problema sul tracker (bugs.python.org)? (Se non già uno.) –

risposta

2

Gli ambiti sono diversi perché Python 3 è più avanzato. :)

Le possibilità di bar inizia con la frastagliata try, e termina dopo l'ultima istruzione nel suo except clausola (o finally clausola se ci fosse stato uno); il nudo raise è chiaramente nella stanza fooexcept ed è ciò che viene controrilanciato.

Questa è una di quelle piccole cose risolte in Python 3. Tuttavia, i documenti potrebbero essere più chiari.

+0

OK, sono d'accordo sul fatto che Python 3 sia più intuitivo. In sostanza volevo la conferma che fosse noto e che le documentazioni dovessero essere migliorate, quindi suppongo che non ci sia altro da dire fino a che il problema 23556 non verrà trattato dal popolo Python. Grazie! – a3nm