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

Расскажи про опциальный метод finally в конструкции try except в Python

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

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

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

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

Finally в Python: обработка исключений

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

Базовая конструкция

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Ошибка: деление на ноль")
finally:
    print("Finally блок выполнен")

Вывод:

Ошибка: деление на ноль
Finally блок выполнен

Даже если исключение было перехвачено, finally всё равно выполнится.

Когда используется finally?

Finally используется для очистки ресурсов: закрытие файлов, соединений с БД, освобождение памяти и т.д.

Пример 1: Работа с файлами

file = None
try:
    file = open('data.txt', 'r')
    content = file.read()
    print(content)
except FileNotFoundError:
    print("Файл не найден")
finally:
    if file:
        file.close()
        print("Файл закрыт")

Это гарантирует, что файл закроется, даже если произойдёт исключение при чтении.

Пример 2: Работа с БД

import sqlite3

connection = None
try:
    connection = sqlite3.connect('database.db')
    cursor = connection.cursor()
    cursor.execute("INSERT INTO users (name) VALUES (?)")
    connection.commit()
except Exception as e:
    print(f"Ошибка БД: {e}")
    connection.rollback()
finally:
    if connection:
        connection.close()
        print("Соединение закрыто")

Это гарантирует закрытие соединения, предотвращая утечку ресурсов.

Пример 3: Работа с HTTP клиентом

import requests

response = None
try:
    response = requests.get('http://api.example.com/data')
    data = response.json()
    print(data)
except requests.exceptions.RequestException as e:
    print(f"Ошибка запроса: {e}")
finally:
    if response:
        response.close()

Порядок выполнения: try → except → finally

def demo():
    try:
        print("1. Try блок")
        return "возвращаем из try"
    except Exception:
        print("2. Except блок")
    finally:
        print("3. Finally блок")

result = demo()
print(f"4. Функция вернула: {result}")

Вывод:

1. Try блок
3. Finally блок
4. Функция вернула: возвращаем из try

Обратите внимание: даже при return в try, finally выполнится ПЕРЕД возвратом!

Finally выполнится даже при sys.exit()?

import sys

try:
    print("Try блок")
    sys.exit(1)
except:
    print("Except блок")
finally:
    print("Finally блок")

Вывод:

Try блок
Finally блок

Finally с исключением

Если в finally произойдёт исключение, оно переопределит исключение из try:

try:
    raise ValueError("Оригинальная ошибка")
except ValueError:
    print("Перехвачена ValueError")
finally:
    raise RuntimeError("Ошибка в finally")

Это важная ловушка: никогда не выбрасывай исключения в finally.

Context Manager вместо try-finally

Для управления ресурсами лучше использовать with:

with open('data.txt', 'r') as file:
    content = file.read()

Context manager использует enter и exit, гарантируя очистку ресурсов. Это предпочтительнее try-finally.

Собственный Context Manager

class DatabaseConnection:
    def __init__(self, db_name):
        self.db_name = db_name
        self.connection = None
    
    def __enter__(self):
        print(f"Подключение к {self.db_name}")
        self.connection = f"Connection to {self.db_name}"
        return self.connection
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"Отключение от {self.db_name}")
        self.connection = None
        return False

with DatabaseConnection('mydb') as conn:
    print(f"Работаем с: {conn}")

Полная конструкция: try-except-else-finally

try:
    data = int(input("Введи число: "))
except ValueError:
    print("Это не число")
else:
    print(f"Ты ввёл число: {data}")
finally:
    print("Готово")

else выполнится только если НЕ было исключения.

Практические советы

  1. Используй with вместо try-finally для управления ресурсами
  2. Не выбрасывай исключения в finally — скроешь оригинальную ошибку
  3. Не пиши сложный код в finally — должен быть простым
  4. Finally гарантирует выполнение при return, исключениях и sys.exit()

Вывод

Finally гарантирует выполнение кода для очистки ресурсов. Современный Python предпочитает context manager'ы (with), но finally остаётся важным для понимания контроля потока программы.

Расскажи про опциальный метод finally в конструкции try except в Python | PrepBro