抛出异常时是否可以自动进入调试器?

Fra*_*ter 12 python exception

如果在最初抛出函数之外捕获异常,则会失去对本地堆栈的访问权限.因此,无法检查可能导致异常的变量值.

有没有办法在import pdb; pdb.set_trace()每次抛出异常来检查本地堆栈时自动启动进入调试器()?

eca*_*mur 19

你不想打破每一个例外; 惯用的Python代码大量使用异常(EAFP),因此您将不断破坏不相关的代码.

相反,使用pdb验尸:import pdb; pdb.pm().这用于sys.last_traceback检查堆栈,包括投掷点处的本地.

  • 假设有一种精确的定义方式,则更有趣的问题陈述是“自动捕获导致程序崩溃的未捕获异常”。 (2认同)
  • 这不能回答问题。我会决定我想做什么。 (2认同)

Cor*_*man 16

ipython支持这个(http://ipython.org).从ipython内部来做

%pdb on
Run Code Online (Sandbox Code Playgroud)

从那时起,每当出现异常时,它都会自动将您置于调试器中.

请注意,您(可能)很快就会厌倦了这种情况......每当您输入错误并出现语法错误时,您将不得不退出调试器.但它有时很有用.


Fra*_*ter 7

我在什么是使用 Python pdb 检查未处理异常的原因的最简单方法的答案中找到了我正在寻找的内容

用它包裹它:

def debug_on(*exceptions):
    if not exceptions:
        exceptions = (AssertionError, )
    def decorator(f):
        @functools.wraps(f)
        def wrapper(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            except exceptions:
                pdb.post_mortem(sys.exc_info()[2])
        return wrapper
    return decorator
Run Code Online (Sandbox Code Playgroud)

例子:

@debug_on(TypeError)
def buggy_function()
    ....
    raise TypeError
Run Code Online (Sandbox Code Playgroud)


sha*_*adi 5

对于python 3(今天是3.8),这可以用

python3 -m pdb myscript.py
Run Code Online (Sandbox Code Playgroud)

文档

当作为脚本调用时,如果被调试的程序异常退出,pdb会自动进入事后调试。事后调试后(或程序正常退出后),pdb 将重新启动程序。自动重新启动会保留 pdb 的状态(例如断点),并且在大多数情况下比在程序退出时退出调试器更有用。

注意启动时python会直接进入pdb模式,需要输入cthenenter开始运行脚本