Starting the Debugger Automatically After an Uncaught Exception
Credit: Thomas Heller
Problem
When running a script, Python normally responds to uncaught exceptions by printing a traceback and terminating execution, but you would prefer to automatically enter an interactive debugger in such cases when feasible.
Solution
By setting sys.excepthook, you can control what
happens after uncaught exceptions:
# code snippet to be included in sitecustomize.py
# Needs Python 2.1 or later!
import sys
def info(type, value, tb):
if hasattr(sys, 'ps1') or not sys.stderr.isatty( ):
# You are in interactive mode or don't have a tty-like
# device, so call the default hook
sys._ _excepthook_ _(type, value, tb)
else:
import traceback, pdb
# You 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 = infoDiscussion
When Python runs a script and an uncaught exception is raised, a
traceback is printed to standard error, and the script is terminated.
Python 2.1 has introduced
sys.excepthook,
which can be used to override the handling of uncaught exceptions.
This lets you automatically start the debugger on an unexpected
exception when Python is not running in interactive mode but a
tty-like device is available.
The code in this recipe is meant to be included in
sitecustomize.py, which is automatically imported by Python at startup. The debugger is started only when Python is run in noninteractive ...