Réponses:
utilisation str
try:
some_method()
except Exception as e:
s = str(e)
De plus, la plupart des classes d'exception auront un args
attribut. Souvent, ce args[0]
sera un message d'erreur.
Il convient de noter que le simple fait d'utiliser str
renverra une chaîne vide s'il n'y a pas de message d'erreur, tandis repr
que l'utilisation recommandée par pyfunc affichera au moins la classe de l'exception. Mon avis est que si vous l'imprimez, c'est pour un utilisateur final qui ne se soucie pas de ce qu'est la classe et veut juste un message d'erreur.
Cela dépend vraiment de la classe d'exception que vous traitez et de la façon dont elle est instanciée. Aviez-vous quelque chose en particulier en tête?
e.message
parce args[0]
que ce n'est peut-être pas vraiment un message.
raise Exception(u'jörn')
. L'échec est particulièrement grave, car vous ne verrez jamais l'exception réelle, mais juste un UnicodeDecodeError
. Si vous ne connaissez pas le codage de l'exception (et la plupart du temps vous ne le savez pas), vous devriez soit travailler sur, repr(e)
soit, si vous en avez vraiment besoin, utiliser un autre bloc try-except dans votre gestion des exceptions qui attrape UnicodeDecodeErrors et revient à repr(e)
.
str
(ou même unicode
ou .format
) qui a provoqué des bogues en raison de la gestion d'Unicode. Si vous n'avez pas le contrôle complet du contenu du message d'erreur, utilisez TOUJOURS repr
pour éviter les erreurs Unicode inattendues.
Utilisez repr () et La différence entre l'utilisation de repr et str
En utilisant repr
:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
En utilisant str
:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
repr
est grâce utile, il semble toute autre chose unicode
, str
codant pour , ... peut soulever une exception en fonction de l'entrée. Pas tout à fait utile lorsque vous essayez de garder l'exception à regarder, mais exception-safe
il semble que
str()
solutions similaires, car cela inclut en fait le type d'exception. Avec str()
je suis arrivé 'status'
alors qu'avec repr()
je suis arrivé KeyError('status')
et j'étais comme « Aaaaah, maintenant je comprends l'erreur ».
Même si je me rends compte que c'est une vieille question, j'aimerais suggérer d'utiliser le traceback
module pour gérer la sortie des exceptions.
Utilisez traceback.print_exc()
pour imprimer l'exception actuelle à l'erreur standard, tout comme elle serait imprimée si elle n'était pas interceptée, ou traceback.format_exc()
pour obtenir la même sortie qu'une chaîne. Vous pouvez passer divers arguments à l'une de ces fonctions si vous souhaitez limiter la sortie ou rediriger l'impression vers un objet de type fichier.
Une autre voie n'a pas encore été donnée:
try:
1/0
except Exception, e:
print e.message
Production:
integer division or modulo by zero
args[0]
pourrait en fait ne pas être un message.
str(e)
pourrait renvoyer la chaîne avec des guillemets environnants et éventuellement avec le début u
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',)"
Éditer
Ma faute !!! Il semble que ce BaseException.message
soit obsolète2.6
, enfin, il semble définitivement qu'il n'y a toujours pas de manière standardisée d'afficher les messages d'exception. Je suppose donc que le mieux est de faire face à e.args
et en str(e)
fonction de vos besoins (et éventuellemente.message
- si la bibliothèque que vous utilisez dépend de ce mécanisme).
Par exemple, avec pygraphviz
, e.message
est le seul moyen d'afficher correctement l'exception, en utilisant str(e)
entourera le message avecu''
.
Mais avec MySQLdb
, la bonne façon de récupérer le message est e.args[1]
: e.message
est vide, et str(e)
affichera'(ERR_CODE, "ERR_MSG")'
Pour python2, il est préférable d'utiliser e.message
pour obtenir le message d'exception, cela évitera possible UnicodeDecodeError
. Mais oui e.message
sera vide pour certaines sortes d'exceptions comme OSError
, dans ce cas, nous pouvons ajouter un exc_info=True
à notre fonction de journalisation pour ne pas manquer l'erreur.
Pour python3, je pense qu'il est sûr à utiliser str(e)
.
Pour inspecter le message d'erreur et faire quelque chose avec lui (avec Python 3) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}