← Назад к вопросам
Что такое блок 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 выполняется в следующих сценариях:
- После успешного выполнения try — если не было ошибок
- После обработки исключения в except — даже если обработчик сам генерирует ошибку
- При возврате из функции (return) — finally все равно выполнится перед выходом
- При явном выбросе исключения в 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 — это гарантия того, что критические операции (закрытие файлов, освобождение памяти, логирование) выполнятся в любом случае.