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

Что такое блок finally в конструкции try catch?

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

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

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

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

Что такое блок finally

Блок finally — это критическая часть обработки ошибок в Python, которая выполняется гарантированно, независимо от того, произошло исключение или нет. Это правило имеет лишь редкие исключения (например, выход из программы через sys.exit()).

Структура try-except-finally

try:
    # Код, который может вызвать исключение
    result = 10 / int(input("Введи число: "))
except ZeroDivisionError:
    # Обработка конкретного типа ошибки
    print("Ошибка: деление на ноль")
except ValueError:
    # Обработка другого типа ошибки
    print("Ошибка: неверный формат ввода")
else:
    # Выполняется ТОЛЬКО если не было исключений
    print(f"Результат: {result}")
finally:
    # Выполняется ВСЕГДА
    print("Завершение работы")

Когда выполняется finally

Блок finally выполняется в следующих сценариях:

  1. После успешного выполнения try — если не было ошибок
  2. После обработки исключения в except — даже если обработчик сам генерирует ошибку
  3. При возврате из функции (return) — finally все равно выполнится перед выходом
  4. При явном выбросе исключения в except — finally выполнится перед распространением исключения выше

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

Закрытие ресурсов (файлы, подключения)

file = None
try:
    file = open("data.txt", "r")
    content = file.read()
except IOError as e:
    print(f"Не удалось открыть файл: {e}")
finally:
    if file:
        file.close()
        print("Файл закрыт")

Работа с базой данных

conn = None
try:
    conn = psycopg2.connect("dbname=test user=postgres")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    data = cursor.fetchall()
except psycopg2.Error as e:
    print(f"Ошибка БД: {e}")
finally:
    if conn:
        conn.close()
        print("Соединение закрыто")

Логирование и очистка ресурсов

def process_data():
    logger.info("Начало обработки")
    try:
        # Долгая операция
        result = expensive_operation()
        return result
    except Exception as e:
        logger.error(f"Ошибка при обработке: {e}")
    finally:
        logger.info("Завершение обработки")
        cleanup_resources()  # Очистка даже при ошибке

Порядок выполнения с return

def test_finally():
    try:
        return "из try"
    finally:
        print("finally выполняется ДО возврата")

result = test_finally()
# Вывод: finally выполняется ДО возврата
# result = "из try"

finally с re-raise

try:
    x = 1 / 0
except ZeroDivisionError:
    print("Перехватили исключение")
    raise  # Пробросили ошибку выше
finally:
    print("finally выполняется даже при re-raise")

# Вывод:
# Перехватили исключение
# finally выполняется даже при re-raise
# ZeroDivisionError: division by zero

Context Manager как современная альтернатива

Вместо try-finally для управления ресурсами используй контекстные менеджеры:

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

# Эквивалент:
file = open("file.txt")
try:
    content = file.read()
finally:
    file.close()

Важные моменты

  • finally НЕ выполняется только при вызове os._exit() или sys.exit() в некоторых случаях
  • Исключение в finally перебивает исходное исключение из try/except
  • Используй finally для гарантированной очистки, но предпочитай context managers (with) для файлов и подключений
  • Перформанс: finally имеет минимальный оверхед и должна использоваться по назначению

Блок finally — это гарантия того, что критические операции (закрытие файлов, освобождение памяти, логирование) выполнятся в любом случае.

Что такое блок finally в конструкции try catch? | PrepBro