NeuronQ NeuronQ - 3 months ago 14x
Python Question

Python - start interactive debugger when exception would be otherwise thrown

Is there any way to make a python program start an interactive debugger, like what

import pdb; pdb.set_trace()
instead of actually throwing an exception?

I know the difficulty of making this work, but it would be much more valuable than a huge stack trace after which I have to use to figure out where to insert breakpoints and then restart the program to debug it. I know that simply making the debugger start instead of throwing an exception would not make sense because any exception can be caught at a level or another, so if I could just select a list of exceptions for which an interactive debug session would start instead of them being thrown (because I know the exceptions in this list would really be "errors" and no meaningful program behavior could follow afterwards)...

I've heard that Common Lisp has something like this, but I don't know how it works exactly, just that "true lispers" praise it a lot...


The simplest way is to wrap your entire code inside a try block like this:

if __name__ == '__main__':

        raise Exception()
        import pdb

There is a more complicated solution which uses sys.excepthook to override the handling of uncaught exceptions, as described in this recipe

## {{{ (r5)
# code snippet, to be included in ''
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)
      import traceback, pdb
      # we are NOT in interactive mode, print the exception...
      traceback.print_exception(type, value, tb)
      # ...then start the debugger in post-mortem mode.

sys.excepthook = info
## end of }}}

The above code should be included in '', which is automatically imported by python. The debugger is only started when python is run in non-interactive mode.