cannot override sys.excepthook

Five years after you wrote this, IPython still works this way, so I guess a solution might be useful to people googling this.

IPython replaces 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, *args, **kwargs):
    traceback_lines = traceback.format_exception(*sys.exc_info())
    del traceback_lines[1]
    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.

Leave a Comment