2009-09-03 7 views
8

je le code python suivant:prise Python 2.6 rétrocompatible exception

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

Cela fonctionne sous Python 2.6, mais la syntaxe "comme e" échoue dans les versions précédentes. Comment puis-je résoudre ceci? Ou, en d'autres termes, comment attraper des exceptions définies par l'utilisateur (et utiliser leurs variables d'instance) sous python 2.6. Je vous remercie!

Répondre

9

Ceci est rétrocompatible:

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

Voir pourquoi le PEP 3110 a changé: http://www.python.org/dev/peps/pep-3110/ – Greg

+1

La syntaxe est certainement rétrocompatible, mais elle n'est pas compatible _forward_. Ceci est invalide dans Python 3 et soulève une erreur de syntaxe. Ouais, ce n'est pas une erreur d'exécution, mais une erreur de compilation qui ne peut pas être détectée. Voir http://docs.python.org/library/sys.html#sys.exc_info et @ Mario-Ruggier's answer ci-dessous – Nathan

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

C'est à la fois compatibilité ascendante et descendante:

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

Cela se débarrasse de la problème d'ambiguïté dans python 2.5 et plus tôt, tout en ne perdant aucun des avantages de la variation de python 2.6/3 ie peut toujours attraper sans ambiguïté plusieurs types d'exception, par exemple except (ConfigurationException, AnotherExceptionType): et, si la gestion par type est nécessaire, peut encore tester pour exc_info()[0]==AnotherExceptionType.