2016-07-30 68 views
6

有时,何时或什么导致它,我不能确定,PDB不会帮助你与像代码:为什么不能访问包含异常的变量?

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

你结束与往常一样迅速,但在尝试访问e会导致:

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

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

+1

确认为Python的3只;它在Python 2中工作(如预期的那样)。 –

回答

7

在Python 3,except .. as target语句的目标时将被清除套房退出。从try statement documentation

当一个异常被使用作为target分配,它在except子句结束被清除。这是因为如果

except E as N: 
    foo 

被翻译成

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

这意味着异常必须被分配到一个不同的名称,以便能够引用它后,除了条款。异常被清除,因为跟踪附加到它们,它们与堆栈帧形成一个引用周期,保持该帧中的所有本地机器都处于活动状态,直到发生下一次垃圾收集。

调用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",) 
相关问题