pdb 事后调试:在异常处理程序中退出后跳转到引发异常

Bur*_*dui 3 exception python-3.x ipdb

我只是好奇是否存在 ipdb 调试器跳回引发异常的源的命令。

考虑下面的小程序。

import sys
import random

def somefun():
    someval = random.random()
    raise Exception()

def run():
    try:
        somefun()
    except Exception:
        sys.exit(10)
Run Code Online (Sandbox Code Playgroud)

run当从命令行(使用 ipython-console)运行该函数时,它会按应有的值以 10 退出。有没有办法启动事后调试器( )并通过跳回pdb.pm()获取值?someval

J_H*_*J_H 5

except Exception:
    sys.exit(10)
Run Code Online (Sandbox Code Playgroud)

有没有办法……通过跳回来获得 someval 的值?

不,它已经消失了。您的错误处理程序吞掉了异常并执行了 python 认为“正常”的操作,尽管父进程会将非零退出状态解释为错误。

当您处于调试上下文中时,引发致命的 python 错误。这是一种方法:

except Exception:
    if debug:
        raise
    else:
        sys.exit(10)
Run Code Online (Sandbox Code Playgroud)

然后调用 as$ python -m pdb some_script.py可以让您检查回溯和值:

(Pdb) bt
Run Code Online (Sandbox Code Playgroud)

(Pdb) p someval
Run Code Online (Sandbox Code Playgroud)