Si j'ai ce code:
try:
some_method()
except Exception,e:
Comment puis-je obtenir cette valeur d'exception (chaîne Représentation que je veux dire)?
Merci
utiliser str
try:
some_method()
except Exception as e:
s = str(e)
En outre, la plupart des classes d’exception auront un attribut args
. args[0]
sera souvent un message d'erreur.
Il convient de noter que l'utilisation de str
retournera une chaîne vide s'il n'y a pas de message d'erreur, alors que l'utilisation de repr
comme recommandé par pyfunc affichera au moins la classe de l'exception. Ma conception est que si vous l'imprimez, c'est pour un utilisateur final qui se fiche de la classe et veut juste un message d'erreur.
Cela dépend vraiment de la classe d'exception à laquelle vous faites face et de la manière dont elle est instanciée. Aviez-vous quelque chose en particulier à l'esprit?
Utiliser repr () et La différence entre utiliser repr et str
Utilisation de repr:
>>> try:
... print x
... except Exception, e:
... print repr(e)
...
NameError("name 'x' is not defined",)
>>>
En utilisant str:
>>>
>>> try:
... print x
... except Exception, e:
... print str(e)
...
name 'x' is not defined
>>>
>>>
Bien que je sache qu'il s'agit d'une vieille question, j'aimerais suggérer d'utiliser le module traceback
pour gérer la sortie des exceptions.
Utilisez traceback.print_exc()
pour imprimer l'exception actuelle à l'erreur standard, comme si elle était imprimée si elle restait non capturée, ou traceback.format_exc()
pour obtenir le même résultat qu'une chaîne. Vous pouvez transmettre divers arguments à l'une ou l'autre de ces fonctions si vous souhaitez limiter la sortie ou rediriger l'impression vers un objet de type fichier.
Un autre moyen n'a pas encore été donné:
try:
1/0
except Exception, e:
print e.message
Sortie:
integer division or modulo by zero
args[0]
pourrait en réalité ne pas être un message.
str(e)
peut renvoyer la chaîne avec les guillemets environnants et éventuellement avec la u
de tête si unicode:
'integer division or modulo by zero'
repr(e)
donne la représentation d'exception complète qui n'est probablement pas ce que vous voulez:
"ZeroDivisionError('integer division or modulo by zero',)"
modifier
Ma faute !!! Il semble que BaseException.message
soit déconseillé à partir de 2.6
, enfin, il semble bien qu’il n’existe toujours pas de méthode normalisée pour afficher les messages d’exception. Donc, je suppose que le mieux est de traiter avec e.args
et str(e)
en fonction de vos besoins (et éventuellement e.message
si la lib que vous utilisez repose sur ce mécanisme).
Par exemple, avec pygraphviz
, e.message
est le seul moyen d'afficher correctement l'exception, l'utilisation de str(e)
entourera le message de u''
.
Mais avec MySQLdb
, le moyen approprié pour récupérer le message est e.args[1]
: e.message
est vide et str(e)
affichera '(ERR_CODE, "ERR_MSG")'
.
Pour python2, il vaut mieux utiliser e.message
pour obtenir le message d'exception, cela évitera une possible UnicodeDecodeError
. Mais oui, e.message
sera vide pour une sorte d'exception comme OSError
, auquel cas nous pouvons ajouter un exc_info=True
à notre fonction de journalisation pour ne pas rater l'erreur.
Pour python3, je pense qu’il est prudent d’utiliser str(e)
.
Si vous ne connaissez pas le type/l'origine de l'erreur, vous pouvez essayer:
import sys
try:
doSomethingWrongHere()
except:
print('Error: {}'.format(sys.exc_info()[0]))
Mais attention, vous aurez un avertissement pep8:
[W] PEP 8 (E722): do not use bare except