Question

De docs Python:

  

sys.excepthook(type, value, traceback)

     

Cette fonction imprime un retraçage donné et exception à sys.stderr.

     

Quand une exception est levée et non détectée, les appels d'un interprète sys.excepthook avec trois arguments, la classe d'exception, instance d'exception, et un objet de retraçage. Dans une session interactive cela se produit juste avant le contrôle est renvoyé à l'invite; dans un programme Python juste avant cela se produit le programme sort. La gestion de ces exceptions de haut niveau peut être personnalisé en attribuant une autre fonction à trois arguments à sys.excepthook.

http://docs.python.org/library/sys.html

Comment puis-je modifier ce globalement si l'action par défaut est toujours invoquer pdb? Y at-il un fichier de configuration que je peux changer? Je ne veux pas envelopper mon code pour le faire.

Était-ce utile?

La solution

Voici ce que vous avez besoin

http://ynniv.com/blog/2007/11/debugging- python.html

Trois façons, la première est simple mais brut ( Thomas Heller ) - ajouter les éléments suivants au site-packages / sitecustomize.py:

import pdb, sys, traceback
def info(type, value, tb):
    traceback.print_exception(type, value, tb)
    pdb.pm()
sys.excepthook = info

Le deuxième est plus complexe, et vérifie le mode interactif (sauter étrangement le débogage en mode interactif), du livre de cuisine :

# code snippet, to be included in 'sitecustomize.py'
import sys

def info(type, value, tb):
   if hasattr(sys, 'ps1') or not sys.stderr.isatty():
      # we are in interactive mode or we don't have a tty-like
      # device, so we call the default hook
      sys.__excepthook__(type, value, tb)
   else:
      import traceback, pdb
      # we are NOT in interactive mode, print the exception...
      traceback.print_exception(type, value, tb)
      print
      # ...then start the debugger in post-mortem mode.
      pdb.pm()

sys.excepthook = info

Et le troisième (qui commencent toujours le débogueur à moins stdin ou stderr sont redirigés) par ynniv

# code snippet, to be included in 'sitecustomize.py'
import sys

def info(type, value, tb):
   if (#hasattr(sys, "ps1") or
       not sys.stderr.isatty() or 
       not sys.stdin.isatty()):
       # stdin or stderr is redirected, just do the normal thing
       original_hook(type, value, tb)
   else:
       # a terminal is attached and stderr is not redirected, debug 
       import traceback, pdb
       traceback.print_exception(type, value, tb)
       print
       pdb.pm()
       #traceback.print_stack()

original_hook = sys.excepthook
if sys.excepthook == sys.__excepthook__:
    # if someone already patched excepthook, let them win
    sys.excepthook = info

Autres conseils

Une autre option consiste à utiliser ipython, que je considère comme un outil indispensable pour tout développeur de python de toute façon. Au lieu d'exécuter votre script à partir du shell, exécutez de ipython avec% run. Lorsqu'une exception se produit, vous pouvez taper% débogage pour déboguer. (Il y a aussi une option pour déboguer automatiquement une exception qui se produit, mais j'oublie ce qu'elle est.)

Essayez:

import pdb
import sys

def excepthook(type, value, traceback):
    pdb.post_mortem(traceback)

excepthook.old = sys.excepthook
sys.excepthook = excepthook

def raise_exception():
    raise_exception()

raise_exception()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top