2009-09-03 15 views
8

Ho il seguente codice Python:making Python 2.6 eccezione compatibile

try: 
     pr.update() 
except ConfigurationException as e: 
     returnString=e.line+' '+e.errormsg 

Questo funziona in Python 2.6, ma la sintassi "come e" non con le versioni precedenti. Come posso risolvere questo? O in altre parole, come faccio a catturare le eccezioni definite dall'utente (e ad usare le loro variabili di istanza) sotto python 2.6. Grazie!

risposta

9

Questo è retrocompatibile:

try: 
    pr.update() 
except ConfigurationException, e: 
    returnString=e.line+' '+e.errormsg 
+2

Vedere PEP 3110 per il motivo per cui è stato modificato: http://www.python.org/dev/peps/pep-3110/ – Greg

+1

La sintassi è sicuramente compatibile con le versioni precedenti, ma non è anche compatibile _forward_. Questo non è valido in Python 3 e solleva un errore di sintassi. Sì, non è un errore di runtime, ma un errore in fase di compilazione che non può essere rilevato. Vedi http://docs.python.org/library/sys.html#sys.exc_info e la risposta di @ Mario-Ruggier qui sotto – Nathan

1
try: 
    pr.update() 
except ConfigurationException, e: 
    returnString = e.line + " " + e.errormsg 
12

Questo è sia in avanti e indietro compatibile:

import sys 
try: 
    pr.update() 
except (ConfigurationException,): 
    e = sys.exc_info()[1] 
    returnString = "%s %s" % (e.line, e.errormsg) 

Questo si libera del problema di ambiguità in Python 2.5 e precedenti, pur non perdendo nessuno dei vantaggi della variazione di Python 2.6/3, vale a dire che può ancora catturare in modo univoco diversi tipi di eccezioni, ad es. except (ConfigurationException, AnotherExceptionType): e, se è necessaria la gestione per tipo, è ancora possibile eseguire il test per exc_info()[0]==AnotherExceptionType.