Python - start interactive debugger when exception would be otherwise thrown

自作多情 提交于 2019-12-02 23:02:07
Boris Gorelik

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 are inside the REPL, you can do

import sys
import pdb
pdb.post_mortem(sys.last_traceback)

See https://docs.python.org/2/library/pdb.html and https://docs.python.org/3/library/traceback.html

I wrote a package to start pdb on exception. It takes @boreis-gorelik's answer, and modifies the interpreter state at runtime so no code changes are necessary:

Installation

 pip install mort

Usage

mort <file.py or module to execute>

When the exception occurs, the pdb repl should start in the given terminal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!