gpt4 book ai didi

Python - 在抛出异常时启动交互式调试器

转载 作者:太空狗 更新时间:2023-10-29 17:17:03 26 4
gpt4 key购买 nike

有没有办法让 python 程序启动交互式调试器,比如 import pdb; pdb.set_trace() 而不是实际抛出异常?

我知道完成这项工作的困难,但它比巨大的堆栈跟踪更有值(value),之后我必须使用它来找出在何处插入断点,然后重新启动程序以对其进行调试。我知道仅仅让调试器启动而不是抛出异常是没有意义的,因为任何异常都可以在一个级别或另一个级别被捕获,所以如果我可以只选择一个异常列表,交互式调试 session 将为其启动而不是它们被抛出(因为我知道这个列表中的异常实际上是“错误”并且之后不会有任何有意义的程序行为)...

我听说 Common Lisp 有类似的东西,但我不知道它到底是如何工作的,只是“真正的 lispers”对它赞不绝口......

最佳答案

最简单的方法是将整个代码包装在 try block 中,如下所示:

if __name__ == '__main__':

try:
raise Exception()
except:
import pdb
pdb.set_trace()

有一个更复杂的解决方案,它使用 sys.excepthook 来覆盖未捕获异常的处理,如 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/ }}}

以上代码应包含在名为 sitecustomize.py 的文件中在 site-packages 目录中,由 python 自动导入。调试器仅在 python 以非交互模式运行时启动。

关于Python - 在抛出异常时启动交互式调试器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13174412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com