CoolPython
Ссылка
нажмите — покажем
нажмите — покажем
try, except, finally и оператор return в Python: как работает finally при наличии return
Python предоставляет механизм обработки исключений с помощью операторов try, except и finally. Когда внутри блока try возникает исключение, оно может быть перехвачено и обработано в блоке except. Кроме того, блок finally позволяет выполнять нужные вам действия независимо от того, произошло исключение или нет.
Но если внутри блока finally использовать оператор return, как в примере выше, возникает особенность.
Вот ещё раз пример кода из опроса:
def try_with_returns():
try:
return 'try clause'
except:
return 'exception clause'
finally:
return 'final clause'
print(try_with_returns())
Можно ожидать, что будет выведено 'try clause' и 'final clause', но фактически выводится только 'final clause'. Почему?
Документация Python объясняет такое поведение. При наличии блока finally, код внутри него должен быть выполнен в любом случае. Поэтому если блок finally содержит return, то возвращаемое значение будет именно то, которое указано внутри finally, а не внутри try, иначе до finally поток исполнения просто не дойдет.
Вот еще один пример для лучшего понимания:
def bool_return():
try:
return True
finally:
return False
print(bool_return())
В этом случае можно ожидать, что будет выведено True, но выводится False. Это снова происходит из-за оператора return в блоке finally, который прерывает выполнение блока try и возвращает значение False.
Итак, при использовании оператора return внутри try/except/finally следует иметь в виду, что возвращаемое значение будет определено блоком finally. И если finally содержит оператор return, то его значение будет возвращено вместо значения из блоков выше.
Дока: https://docs.python.org/3/tutorial/errors.html?highlight=try%20finally#defining-clean-up-actions
30 · 5.9K ·