为什么pdb不能访问包含异常的变量?

e-s*_*tis 8 python debugging exception python-3.x pdb

有时,我无法确定何时或是什么导致它,pdb将无法帮助您使用以下代码:

try:
    foo()
except Exception as e:
   import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

您最终得到了通常的提示,但尝试访问e将导致:

(pdb) e
*** NameError: name 'e' is not defined.
Run Code Online (Sandbox Code Playgroud)

当然不是所有的时间,它发生在Linux,Windows,我的机器,我的同事机器上......

Mar*_*ers 9

在Python 3中,except .. as target当套件退出时,语句的目标被清除.从try声明文件:

使用as分配异常target时,将在except子句的末尾清除它.这就好像

except E as N:
    foo
Run Code Online (Sandbox Code Playgroud)

被翻译成

except E as N:
    try:
        foo
    finally:
        del N
Run Code Online (Sandbox Code Playgroud)

这意味着必须将异常分配给不同的名称才能在except子句之后引用它.异常被清除,因为附加了回溯,它们与堆栈帧形成一个引用循环,使该帧中的所有本地生存,直到下一次垃圾收集发生.

调用pdb.set_trace()有效地退出块,因此finally执行上面的隐式套件.

将异常绑定到另一个名称:

try:
    foo()
except Exception as e:
   exception = e
   import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

演示:

>>> try:
...     foo()
... except Exception as e:
...    exception = e
...    import pdb; pdb.set_trace()
...
--Return--
> <stdin>(5)<module>()->None
(Pdb) e
*** NameError: name 'e' is not defined
(Pdb) exception
NameError("name 'foo' is not defined",)
Run Code Online (Sandbox Code Playgroud)