I try to customize behavior of
sys.excepthook as described by the recipe.
:import pdb, sys, traceback :def info(type, value, tb): : traceback.print_exception(type, value, tb) : pdb.pm() :sys.excepthook = info :-- x = 5 ------------------------------------------------- Traceback (most recent call last): File "<ipython console>", line 1, in <module> NameError: name 'x' is not defined >>>
pdb.pm() is not being called. It seems that
sys.excepthook = info doesn’t work in my python 2.5 installation.
ipython, which you’re using instead of the normal Python interactive shell, traps all exceptions itself and does NOT use sys.excepthook. Run it as
ipython -pdb instead of just
ipython, and it will automatically invoke pdb upon uncaught exceptions, just as you are trying to do with your excepthook.
Five years after you wrote this, IPython still works this way, so I guess a solution might be useful to people googling this.
sys.excepthook every time you execute a line of code, so your overriding of sys.excepthook has no effect. Furthermore, IPython doesn’t even call
sys.excepthook, it catches all exceptions and handles them itself before things get that far.
To override the exception handler whilst IPython is running, you can monkeypatch over their shell’s
showtraceback method. For example, here’s how I override to give what looks like an ordinary Python traceback (because I don’t like how verbose IPython’s are):
def showtraceback(self): traceback_lines = traceback.format_exception(*sys.exc_info()) del traceback_lines message = ''.join(traceback_lines) sys.stderr.write(message) import sys import traceback import IPython IPython.core.interactiveshell.InteractiveShell.showtraceback = showtraceback
This works in both the normal terminal console and the Qt console.
expanding on Chris answer, you can use another function like a decorator to add your own functionality to jupyters showbacktrace:
from IPython.core.interactiveshell import InteractiveShell from functools import wraps import traceback import sys def change_function(func): def showtraceback(*args, **kwargs): # extract exception type, value and traceback etype, evalue, tb = sys.exc_info() if issubclass(etype, Exception): print('caught an exception') else: # otherwise run the original hook value = func(*args, **kwargs) return value return showtraceback InteractiveShell.showtraceback = change_function(InteractiveShell.showtraceback) raise IOError
See this SO question and make sure there isn’t something in your
sitecustomize.py that prevents debugging in interactive mode.