169 votes

Extraire les informations de traçage d'un objet d'exception

Étant donné un objet d'exception (d'origine inconnue), existe-t-il un moyen d'obtenir sa trace ? J'ai un code comme celui-ci :

def stuff():
   try:
       .....
       return useful
   except Exception as e:
       return e

result = stuff()
if isinstance(result, Exception):
    result.traceback <-- How?

Comment puis-je extraire le retour de trace de l'objet Exception une fois que je l'ai obtenu ?

9voto

ecatmur Points 64173

Il y a une très bonne raison pour laquelle la traceback n'est pas stockée dans l'exception ; parce que la traceback contient des références aux locals de sa pile, cela résulterait en une référence circulaire et une fuite de mémoire (temporaire) jusqu'à ce que la GC circulaire entre en jeu. (C'est pourquoi vous devriez ne jamais stocker le traceback dans une variable locale .)

La seule chose à laquelle je pense serait que vous fassiez un monkeypatch. stuff de façon à ce que lorsqu'il pense attraper Exception il s'agit en fait d'attraper un type spécialisé et l'exception se propage jusqu'à vous en tant qu'appelant :

module_containing_stuff.Exception = type("BogusException", (Exception,), {})
try:
    stuff()
except Exception:
    import sys
    print sys.exc_info()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X