💻 Практические примеры

⚡ Минимальный рабочий пример

# safe_divide.py
def safe_divide(a: float, b: float) -> float:
    try:
        return a / b
    except ZeroDivisionError:
        print("Ошибка: деление на ноль")
        return 0.0


print(safe_divide(10, 2))  # 5.0
print(safe_divide(10, 0))  # 0.0

Перехватываем ZeroDivisionError и возвращаем безопасное значение вместо падения программы.

Пример 1. Базовый try/except

Перехват конкретного исключения позволяет программе продолжить работу.

# example_01_basic.py
try:
    result = 10 / 0
    print("Эта строка не выполнится")
except ZeroDivisionError:
    print("Ошибка: деление на ноль!")

print("Программа продолжает работу")

Пример 2. Несколько обработчиков

Python выбирает первый подходящий обработчик. Общий Exception должен быть последним.

# example_02_order.py
try:
    value = int(input("Введите целое число: "))
    result = 100 / value
    print(f"Результат: {result}")
except ValueError:
    print("Ошибка: нужно ввести целое число.")
except ZeroDivisionError:
    print("Ошибка: нельзя делить на ноль.")
except Exception as e:
    print(f"Неожиданная ошибка: {e}")

Пример 3. Обработка нескольких исключений в одном блоке

Кортеж типов исключений удобен, когда реакция на ошибки одинаковая.

# example_03_tuple.py
while True:
    try:
        number = int(input("Введите ненулевое число: "))
        result = 10 / number
        print(f"Результат: {result}")
        break
    except (ValueError, ZeroDivisionError):
        print("Ошибка! Введите корректное ненулевое число.")

Пример 4. Доступ к сообщению об ошибке

Конструкция as e сохраняет объект исключения в переменной.

# example_04_as.py
try:
    number = int("abc")
except (ValueError, ZeroDivisionError) as e:
    print(f"Произошла ошибка: {e}")

Пример 5. try/except/else/finally

Разделим логику успеха, ошибки и завершения.

# example_05_full.py
try:
    number = int(input("Введите число: "))
    result = 10 / number
except ValueError:
    print("Некорректное значение.")
except ZeroDivisionError:
    print("Деление на ноль.")
else:
    print(f"Результат деления: {result}")
finally:
    print("Программа завершена.")

Пример 6. Возбуждение исключения через raise

Используем raise, чтобы явно указать на нарушение правила.

# example_06_raise.py
def check_age(age: int) -> None:
    if age < 18:
        raise ValueError("Возраст должен быть 18 лет и старше.")
    print("Доступ разрешён.")


try:
    user_age = int(input("Введите возраст: "))
    check_age(user_age)
except ValueError as e:
    print(f"Ошибка: {e}")

Пример 7. Пользовательское исключение

Собственные исключения делают код более выразительным и помогают отличать бизнес-ошибки от встроенных.

# example_07_custom.py
class InsufficientFundsError(Exception):
    """Ошибка: недостаточно средств на счёте."""

    def __init__(self, balance: float, amount: float):
        self.balance = balance
        self.amount = amount
        super().__init__(
            f"Недостаточно средств: баланс {balance}, требуется {amount}"
        )


def withdraw(balance: float, amount: float) -> float:
    if amount > balance:
        raise InsufficientFundsError(balance, amount)
    return balance - amount


try:
    new_balance = withdraw(100.0, 250.0)
    print(f"Остаток: {new_balance}")
except InsufficientFundsError as e:
    print(e)
⚠️ Проверить по документации: пользовательские исключения и переопределение __init__ не разбираются в исходной лекции, но являются стандартным подходом Python.

Пример 8. Проверка через assert

assert используется для внутренних инвариантов, которые всегда должны быть истинны.

# example_08_assert.py
def calculate_discount(price: float, discount: float) -> float:
    assert price >= 0, "Цена не может быть отрицательной"
    assert 0 <= discount <= 1, "Скидка должна быть в диапазоне [0, 1]"
    return price * (1 - discount)


print(calculate_discount(100.0, 0.2))  # 80.0
# calculate_discount(-10, 0.2)         # AssertionError
⚠️ Проверить по документации: assert и AssertionError не входят в исходную лекцию.

Пример 9. Логирование в консоль

Модуль logging заменяет print при выводе диагностических сообщений.

# example_09_logging_console.py
import logging

logging.basicConfig(level=logging.DEBUG)

logging.debug("Отладочное сообщение")
logging.info("Информационное сообщение")
logging.warning("Предупреждение")
logging.error("Ошибка")
logging.critical("Критическая ошибка")

Пример 10. Логирование в файл

Запись ошибок в файл позволяет анализировать работу программы позже.

# example_10_logging_file.py
import logging

logging.basicConfig(
    filename="app.log",
    format="%(asctime)s - %(filename)s - %(lineno)d - %(levelname)s - %(message)s",
    level=logging.INFO,
)

logging.info("Программа запущена")
logging.warning("Низкий уровень памяти")
logging.error("Ошибка подключения к базе данных")

Пример 11. Логирование исключений

Сообщение об ошибке можно записать в лог, чтобы не потерять причину сбоя.

# example_11_logging_exception.py
import logging

logging.basicConfig(filename="errors.log", level=logging.ERROR)

try:
    result = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"Ошибка при делении: {e}")

Пример 12. Безопасное деление с логированием

Комбинируем ввод, обработку ошибок и логирование в одной функции.

# example_12_safe_divide_logged.py
import logging

logging.basicConfig(
    filename="errors.log",
    format="%(asctime)s - %(filename)s - %(lineno)d - %(levelname)s - %(message)s",
    level=logging.ERROR,
)


def safe_divide(dividend: str, divisor: str) -> float | None:
    try:
        a = float(dividend)
        b = float(divisor)
        return a / b
    except ValueError:
        logging.error("Ошибка: Введено некорректное число.")
        print("Ошибка: Введено некорректное число.")
    except ZeroDivisionError:
        logging.error("Ошибка: Деление на ноль.")
        print("Ошибка: Деление на ноль.")
    return None


result = safe_divide("345", "5a")
print(result)

Как запустить в VS Code

  1. Создайте файл, например exceptions_examples.py.
  2. Скопируйте код одного из примеров выше.
  3. Откройте терминал в VS Code (Ctrl + `).
  4. Убедитесь, что активировано виртуальное окружение: venv\Scripts\activate (Windows) или source venv/bin/activate (Mac/Linux).
  5. Запустите: python exceptions_examples.py