python-否则就会出现异常时开始交互式调试器



是否有任何方法可以使Python程序启动一个交互式调试器,例如import pdb; pdb.set_trace()而不是实际抛出异常?

我知道制作这项工作的困难,但是它比巨大的堆栈跟踪要有价值得多,然后我必须用它来弄清楚在哪里插入断点,然后重新启动程序进行调试。我知道,简单地进行调试器开始而不是抛出异常是没有意义的,因为任何例外都可以在一个或其他级别上捕获,因此如果我只能选择一个互动调试会话的例外列表而不是被抛出的(因为我知道此列表中的异常确实是"错误",并且以后没有任何有意义的程序行为可以随之而来)...

我听说Common Lisp有类似的东西,但是我不知道它是如何工作的,只是"真正的Lispers"赞美了很多...

最简单的方法是将整个代码包装在try块中:

if __name__ == '__main__':
    try:
        raise Exception()
    except:
        import pdb
        pdb.set_trace()

有一个更复杂的解决方案,该解决方案使用sys.excepthook来覆盖未熟悉的例外的处理,如本食谱中所述:

## {{{ 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/ }}}

上面的代码应包含在site-packages目录中的名为sitecustomize.py的文件中,该目录是由Python自动导入的。调试器仅在Python以非相互作用模式运行时开始。

这个问题很旧,所以这主要用于将来me

try:
    ...
except:
    import traceback, pdb, sys
    traceback.print_exc()
    print ''
    pdb.post_mortem()
    sys.exit(1)

我写了一个包裹以启动pdb异常。它需要 @boreis-gorelik的答案,并在运行时修改解释器状态,因此无需更改代码:

安装

 pip install mort

用法

mort <file.py or module to execute>

发生异常时,PDB repl应该在给定的终端

开始

如果您在repper内部,则可以做

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

请参阅https://docs.python.org/2/library/pdb.html和https://docs.python.org/3/library/traceback.html

相关内容

最新更新