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 try-except-finally block is used in Python programs to perform the exception-handling task. Much like that of Java, code that may or may not raise an exception should be placed in the try block.
Starting Python Debugger To start debugging within the program just insert import pdb, pdb. set_trace() commands. Run your script normally, and execution will stop where we have introduced a breakpoint. So basically we are hard coding a breakpoint on a line below where we call set_trace().
When we run our script without specifying any breakpoints, it will stop at the line which causes the error (or execute the entire script if there are no errors). However, we might also want to stop the program earlier and inspect the state of the variables at that particular point.
The simplest way is to wrap your entire code inside a try
block like this:
if __name__ == '__main__': try: raise Exception() except: import pdb pdb.set_trace()
There is a more complicated solution which uses sys.excepthook
to override the handling of uncaught exceptions, as described in this recipe:
## {{{ http://code.activestate.com/recipes/65287/ (r5) # 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 ## end of http://code.activestate.com/recipes/65287/ }}}
The above code should be included in a file called sitecustomize.py
inside site-packages
directory, which is automatically imported by python. The debugger is only started when python is run in non-interactive mode.
This question is quite old, so this is mainly for future me
try: ... except: import traceback, pdb, sys traceback.print_exc() print '' pdb.post_mortem() sys.exit(1)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With