Si j'ai ce code:
try:
some_method()
except Exception, e:
Comment puis-je obtenir cette valeur d'exception (représentation de chaîne, je veux dire)?
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
parceargs[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 unUnicodeDecodeError
. 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êmeunicode
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 TOUJOURSrepr
pour éviter les erreurs Unicode inattendues.En utilisant
repr
:En utilisant
str
:la source
repr
est grâce utile, il semble toute autre choseunicode
,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, maisexception-safe
il semble questr()
solutions similaires, car cela inclut en fait le type d'exception. Avecstr()
je suis arrivé'status'
alors qu'avecrepr()
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, outraceback.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.la source
Une autre voie n'a pas encore été donnée:
Production:
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ébutu
si unicode:repr(e)
donne la représentation d'exception complète qui n'est probablement pas ce que vous voulez:É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 enstr(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 utilisantstr(e)
entourera le message avecu''
.Mais avec
MySQLdb
, la bonne façon de récupérer le message este.args[1]
:e.message
est vide, etstr(e)
affichera'(ERR_CODE, "ERR_MSG")'
la source
Pour python2, il est préférable d'utiliser
e.message
pour obtenir le message d'exception, cela évitera possibleUnicodeDecodeError
. Mais ouie.message
sera vide pour certaines sortes d'exceptions commeOSError
, dans ce cas, nous pouvons ajouter unexc_info=True
à notre fonction de journalisation pour ne pas manquer l'erreur.Pour python3, je pense qu'il est sûr à utiliser
str(e)
.la source
Si vous ne connaissez pas le type / l'origine de l'erreur, vous pouvez essayer:
Mais soyez conscient, vous obtiendrez un avertissement pep8:
la source
Pour inspecter le message d'erreur et faire quelque chose avec lui (avec Python 3) ...
la source