Lors du débogage Python à l'invite interactive (REPL), souvent j'écrirai du code qui déclenche une exception, mais je ne l'ai pas enveloppé dans un try
/except
, donc une fois l'erreur déclenchée, j'ai définitivement perdu l'objet d'exception.
Souvent, le retraçage et le message d'erreur Python s'affiche ne suffit pas. Par exemple, lors de la récupération d'une URL, le serveur peut renvoyer une erreur 40x et vous avez besoin du contenu de la réponse via error.read()
... mais vous n'avez plus l'objet d'erreur. Par exemple:
>>> import urllib2
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
urllib2.HTTPError: HTTP Error 400: Bad Request
Drat, qu'a dit le corps de la réponse? Il contenait probablement de précieuses informations sur les erreurs ...
Je me rends compte qu'il est généralement facile de réexécuter votre code enveloppé dans un essai/sauf, mais ce n'est pas idéal. Je réalise également que dans ce cas spécifique, si j'utilisais la bibliothèque requests
(qui ne soulève pas d'erreurs HTTP), je n'aurais pas ce problème ... mais je me demande vraiment s'il y a un moyen plus général d'obtenir le dernier objet d'exception à une invite Python dans ces cas.
Le module sys
fournit certaines fonctions pour l'examen post-hoc des exceptions: sys.last_type
, sys.last_value
et sys.last_traceback
.
sys.last_value
est celui que vous recherchez.
Comme l'a mentionné @Cairnarvon, je n'ai trouvé aucun membre last_value
Est un module sys.
sys.exc_info()
a fait l'affaire pour moi. sys.exc_info()
renvoie un Tuple avec trois valeurs (type, value, traceback)
.
Donc sys.exc_info()[1]
donnera l'erreur lisible. Voici l'exemple,
import sys
list = [1,2,3,4]
try:
del list[8]
except Exception:
print(sys.exc_info()[1])
affichera list assignment index out of range
De plus, traceback.format_exc()
du module traceback
peut être utilisé pour imprimer les informations similaires.
Ci-dessous la sortie si format_exec()
est utilisée,
Traceback (most recent call last):
File "python", line 6, in <module>
IndexError: list assignment index out of range