2016-11-27 1 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' (' RuntimeError' перед Python 3.5) является просто исключением и может быть пойман и обработан конструкциями 'try/except/finally'. 2. Блок 'finally' должен быть выполнен. Эти два утверждения - все, что вам нужно, чтобы интерпретировать то, что происходит в вашем коде. –

+0

Отредактировал вопрос, чтобы сосредоточиться на одной проблеме, как предложено @jonrsharpe – OwenHoward

ответ

2

кажется, что ошибка вы встречая на самом деле следовало ожидать, так как он явно проверяется на в Lib/test/test_sys.py функции test_recursionlimit_fatalerror.

Теперь, не критикуя ваши яркие эксперименты, это также причина ошибки, которая вызывает segfault (иногда, см. Вопрос); уже один отчет об этом был the Python bug tracker как issue 28179.

Следите за этой веткой, если вам интересно, что вызывает это.

Смежные вопросы