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

Какие блоки для обработки исключений есть в Python?

1.6 Junior🔥 211 комментариев
#Python Core

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

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

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

Блоки для обработки исключений в Python

Python предоставляет несколько конструкций для обработки ошибок и исключений: try, except, else, finally и context managers с with.

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

# Простой случай: перехватываем исключение
try:
    result = 10 / 0  # ZeroDivisionError
except ZeroDivisionError:
    print("Деление на ноль!")
    result = 0

# Результат: "Деление на ноль!" и result = 0

Несколько except блоков

# Разные обработчики для разных исключений
try:
    data = {"name": "John"}
    age = int(data["age"])
except KeyError:
    print("Ключ не найден в словаре")
except ValueError:
    print("Не могу преобразовать в число")
except Exception as e:
    print(f"Неизвестная ошибка: {e}")

# Можно обрабатывать несколько исключений в одном блоке
try:
    value = int("abc")
except (ValueError, TypeError):
    print("Ошибка преобразования")

Блок else - выполняется если ошибки НЕ было

# else выполняется только если НЕ было исключения в try
try:
    number = int("42")
except ValueError:
    print("Ошибка преобразования")
else:
    # Выполняется ТОЛЬКО если try прошёл успешно
    print(f"Число успешно преобразовано: {number}")
    print(f"Число в квадрате: {number ** 2}")

Блок finally - выполняется ВСЕГДА

# finally выполняется в любом случае (с исключением или без)
def read_file(filename):
    try:
        file = open(filename, "r")
        data = file.read()
        print(f"Прочитано: {len(data)} символов")
    except FileNotFoundError:
        print("Файл не найден")
        data = None
    finally:
        # Выполнится всегда, даже при исключении
        if "file" in locals():
            file.close()
            print("Файл закрыт")

read_file("data.txt")
# Результат:
# Файл не найден
# Файл закрыт

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

def process_user_data(user_input):
    try:
        # Попытка выполнить опасную операцию
        age = int(user_input)
        print("Парсинг прошёл успешно")
    except ValueError:
        # Выполняется если было исключение
        print("Ошибка: введите число")
        age = None
    else:
        # Выполняется если в try НЕ было исключений
        if age < 0:
            raise ValueError("Возраст не может быть отрицательным")
        print(f"Возраст валидный: {age}")
    finally:
        # Выполняется ВСЕГДА
        print("Обработка данных завершена\n")

process_user_data("25")    # Всё ок
process_user_data("abc")   # Ошибка в try

Доступ к информации об исключении

# Доступ к объекту исключения
try:
    result = 1 / 0
except ZeroDivisionError as e:
    print(f"Тип ошибки: {type(e).__name__}")
    print(f"Сообщение: {str(e)}")
    print(f"Args: {e.args}")

# Получение полного traceback
import traceback

try:
    data = {"key": "value"}
    print(data["missing"])
except KeyError:
    # Получить весь stack trace
    traceback.print_exc()
    
    # Или как строку
    error_message = traceback.format_exc()
    print(error_message)

Кастомные исключения

# Определение своего исключения
class InvalidAgeError(Exception):
    """Исключение для невалидного возраста"""
    pass

class InsufficientFundsError(Exception):
    """Исключение для недостатка средств"""
    def __init__(self, balance: float, required: float):
        self.balance = balance
        self.required = required
        super().__init__(f"Баланс {balance}, требуется {required}")

# Использование кастомных исключений
def transfer_money(account, amount: float):
    try:
        if amount > account.balance:
            raise InsufficientFundsError(account.balance, amount)
        account.balance -= amount
        print(f"Переведено {amount}")
    except InsufficientFundsError as e:
        print(f"Ошибка: {e}")
        print(f"Баланс: {e.balance}, нужно: {e.required}")

Context managers (with) для автоматической очистки

# with автоматически вызывает __exit__ даже при ошибке
with open("file.txt", "r") as f:
    data = f.read()
    # Файл автоматически закроется

# Кастомный context manager
class Database:
    def __enter__(self):
        print("Подключение к БД...")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Отключение от БД...")
        if exc_type is not None:
            print(f"Ошибка: {exc_type.__name__}")
        return False  # Пробросить исключение дальше

with Database() as db:
    print("Работа с БД")
    # При выходе вызовется __exit__

Переброс исключений (raise)

# Переброс исключения дальше
try:
    result = process_data()
except ValueError:
    print("Обработана ошибка")
    raise  # Переброс дальше

# Цепочка исключений
try:
    file = open("missing.txt")
except FileNotFoundError as e:
    raise RuntimeError("Не могу прочитать конфиг") from e

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

Сценарийtryexceptelsefinally
Нет ошибок
Есть исключение
Исключение в except❌ (переброс)

Это основной механизм для надёжной обработки ошибок в Python приложениях.

Какие блоки для обработки исключений есть в Python? | PrepBro