首先我嘗試了這個
def x():
try:
1/0 # just an division error to get an exception
except:
x()
這段代碼在 3.10 中表現正常,我得到RecursionError: maximum recursion depth exceeded了預期的結果,但是 3.8 進入堆疊溢位并且不能正確處理遞回錯誤。但我確實記得RecursionError在舊版本的 Python 中也有,所以我嘗試了
def x(): x()
這會RecursionError在兩個版本的 Python 中回饋。
就好像(在第一個片段中)遞回錯誤永遠不會在 except 中拋出,而是在呼叫的函式中拋出,然后在呼叫但由 try-except 處理的函式的第一條指令處拋出錯誤。
然后我嘗試了別的東西:
def x():
try:
x()
except:
x()
這在某種程度上更奇怪,堆疊溢位低于 3.10 但它卡在 3.10 的回圈中
你能解釋一下這種行為嗎?
更新 @MisterMiyagi 發現了一個更奇怪的行為,在 except in 中添加陳述句<=python3.9不會導致 stackoverflow
def x():
try:
1/0
except:
print("")
x()
uj5u.com熱心網友回復:
3.10 和其他版本的不同行為似乎是由于 Python 問題(python/cpython#86666),您還可以在 Python 2.7 上看到正確的錯誤。
列印“修復”了一些事情,因為它讓 Python 再次檢查遞回限制,并通過一條可能沒有損壞的路徑。您可以在此處查看它執行此操作的代碼,它還會跳過重復檢查物件是否支持 Vectorcall 呼叫協議,因此諸如int保留致命錯誤之類的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515679.html
