2016-11-27 27 views
4

今天早些時候,我在Python瞭解這種奇怪的情況下,Java & JS對於這個遞歸代碼,爲什麼Python 2.7沒有給出堆棧溢出錯誤,但3.5呢?

try: 
    return True 
finally: 
    return False 

它返回False

所以,我決定把玩具與它周圍:

def caseThree(): 
    try: 
     caseThree() 
    except: 
     print("Error") 
     caseThree() 
    finally: 
     return False 
print(caseThree()) 

在Python 2.7這將返回:

Error 
False 

然而,在Python 3.5

Error 
Fatal Python error: Cannot recover from stack overflow. 

Current thread 0x000025ec (most recent call first): 
    File "`<stdin>`", line 3 in caseThree 

最後一行直到你最終得到:...

任何人都可以解釋爲什麼2.7的代碼不會導致堆棧溢出,而3.5呢?

+2

*「唯一的區別是我們將遞歸從最終移到try」* - 您爲什麼期望這*不會*改變輸出?目前還不清楚你在這裏有什麼令人驚訝的,或者爲什麼。你能關注一個具體問題嗎? – jonrsharpe

+0

1.'RecursionError'(Python 3.5之前的'RuntimeError')只是一個異常,可能被'try/except/finally'結構捕獲和處理。 2.'finally'塊必須被執行。這兩個語句就是您需要解釋代碼中發生的事情的全部內容。 –

+0

按照@jonrsharpe – OwenHoward

回答

2

看來,錯誤相遇其實是意料之中的,因爲它是在Lib/test/test_sys.py功能test_recursionlimit_fatalerror明確的測試。

現在,沒有批評你多彩的實驗,這是導致段錯誤的原因(有時,見問題);已經有一個這樣的報告給the Python bug tracker作爲issue 28179

請關注該線程,如果您對引起此問題的原因感興趣。