← Назад к вопросам

Что такое finally?

1.0 Junior🔥 151 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

finally в Python

finally — это блок кода, который выполняется всегда, независимо от того, произошло исключение или нет. Он является частью конструкции try-except-finally и используется для освобождения ресурсов или выполнения критически важного кода очистки.

Синтаксис

try:
    # Основной код
    risky_operation()
except SomeException:
    # Обработка исключения
    handle_error()
finally:
    # Код, который выполнится ВСЕГДА
    cleanup()

Ключевые особенности

  1. Гарантированное выполнение — блок finally выполняется в любом случае:

    • Если исключение не было
    • Если исключение было обработано
    • Если исключение не было обработано (но сначала выполнится finally, потом исключение пройдёт выше)
    • Даже если в except есть return
  2. Return в finally переопределяет return в except

    def example():
        try:
            raise ValueError()
        except ValueError:
            return "Error handled"
        finally:
            return "Finally wins"
    
    print(example())  # Выведет: Finally wins
    

Примеры использования

Работа с файлами:

f = None
try:
    f = open("file.txt", "r")
    content = f.read()
except IOError as e:
    print(f"Ошибка чтения файла: {e}")
finally:
    if f:
        f.close()  # Гарантированно закроется

Работа с подключениями к БД:

connection = None
try:
    connection = db.connect()
    result = connection.query("SELECT * FROM users")
except ConnectionError:
    print("Не удалось подключиться к БД")
finally:
    if connection:
        connection.close()  # Соединение закроется в любом случае

Современный подход: Context Manager (with)

В современном Python рекомендуется использовать context manager вместо try-finally:

# Старый способ (с finally)
f = open("file.txt")
try:
    content = f.read()
finally:
    f.close()

# Современный способ (with)
with open("file.txt") as f:
    content = f.read()  # f.close() вызовется автоматически

Context manager вызывает метод __exit__ автоматически, что эквивалентно finally, но безопаснее и чище.

finally без except

finally может использоваться и без except:

try:
    result = 10 / int(input("Число: "))
except ZeroDivisionError:
    print("Деление на ноль!")
finally:
    print("Выполнение завершено")

Важный момент: finally и exit()

finally выполнится даже при sys.exit(), но не выполнится при os._exit():

import sys

try:
    sys.exit()  # finally ВЫПОЛНИТСЯ
finally:
    print("Это выведется")  # Это выведется

Итоги

finally — это инструмент для гарантированной очистки ресурсов. Однако в современном Python рекомендуется использовать context manager (with), который делает код более читаемым и безопасным. finally остаётся полезным в сложных сценариях с несколькими ресурсами или когда нужна специальная логика очистки.

Что такое finally? | PrepBro