2016-07-30 103 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",) 
相關問題