Python - start interactive debugger when exception would be otherwise thrown

后端 未结 4 1170
-上瘾入骨i
-上瘾入骨i 2021-02-04 03:16

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

相关标签:
4条回答
  • 2021-02-04 04:07

    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

    0 讨论(0)
  • 2021-02-04 04:12

    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)
    
    0 讨论(0)
  • 2021-02-04 04:13

    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

    0 讨论(0)
  • 2021-02-04 04:16

    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.

    0 讨论(0)
提交回复
热议问题