Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - start interactive debugger when exception would be otherwise thrown

Tags:

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...

like image 727
NeuronQ Avatar asked Nov 01 '12 09:11

NeuronQ


People also ask

How can you conditionally raise and handle an exception during debugging in Python?

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.

How do I start Python in debug mode?

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().

What will happen if you run an erroneous script without a breakpoint?

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.


2 Answers

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.

like image 160
Boris Gorelik Avatar answered Oct 08 '22 17:10

Boris Gorelik


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) 
like image 35
dan_waterworth Avatar answered Oct 08 '22 16:10

dan_waterworth