web-dev-qa-db-fra.com

Obtenir la valeur d'exception en Python

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

189
Frias

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?

252
aaronasterling

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
>>> 
>>> 
149
pyfunc

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.

23
Blckknght

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.messagesoit 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")'.

23
cedbeu

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).

0
apporc

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
0
Kostanos