2017-05-30 23 views
3

由於Python中的變量是它們的環以外訪問和try - except塊,我天真地以爲下面這個代碼片斷將正常工作,因爲e將訪問:範圍捕獲到的異常情況和3

try: 
    int('s') 
except ValueError as e: 
    pass 
print(e) 

在Python 2(2.7測試),它的工作如我所料,輸出是:

invalid literal for int() with base 10: 's' 

然而,在Python 3我很驚訝的是,輸出爲:

NameError: name 'e' is not defined 

這是爲什麼?

回答

5

我後來發現了一個答案,因爲PEP 3110解釋說,在Python 3中,捕獲的名稱在except套件末尾被刪除,以實現更高效的垃圾收集。另外也建議語法,如果你想避免這種情況發生:

的情況下,有必要保持周圍 一個異常實例過去的套件,除了年底可以很容易地轉換,像這樣

try: 
    ... 
except E as N: 
    ... 
... 

變得

這樣,當N在該塊的結束時被刪除,正將持續存在 ,可用於爲正常。