5.8Kпросмотров
31 мая 2023 г.
Score: 6.3K
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