为什么 pdb 无法访问包含异常的变量?



有时,我无法确定是什么时候或是什么原因导致的,pdb不会帮助您处理以下代码:

try:
    foo()
except Exception as e:
   import pdb; pdb.set_trace()

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

(pdb) e
*** NameError: name 'e' is not defined.

当然,这并不是所有的时间,它发生在linux、windows、我的机器、我的同事机器上。。。

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

当使用作为target分配异常时,它将在except子句的末尾被清除。这就好像

except E as N:
    foo

已翻译为

except E as N:
    try:
        foo
    finally:
        del N

这意味着必须将异常分配给不同的名称,以便能够在except子句之后引用它。异常会被清除,因为在附加了回溯的情况下,它们与堆栈帧形成了一个引用循环,使该帧中的所有局部保持活动状态,直到下一次垃圾回收发生。

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

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

try:
    foo()
except Exception as e:
   exception = e
   import pdb; pdb.set_trace()

演示:

>>> 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",)

相关内容

最新更新