web-dev-qa-db-fra.com

Comment obtenir le dernier objet d'exception après qu'une erreur est déclenchée à l'invite Python?

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.

47
Ben Hoyt

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.

59
Cairnarvon

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
16
Sambhav Pandey