有时,我无法确定何时或是什么导致它,pdb将无法帮助您使用以下代码:
try:
foo()
except Exception as e:
import pdb; pdb.set_trace()
您最终会得到通常的提示,但尝试访问e
会导致:
(pdb) e
*** NameError: name 'e' is not defined.
当然不是所有的时间,它发生在Linux,Windows,我的机器,我的同事机器上......
答案 0 :(得分:8)
在Python 3中,当套件退出时,except .. as target
语句的目标被清除。来自try
statement documentation:
如果使用
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",)