Пример 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
- Создайте файл, например
exceptions_examples.py. - Скопируйте код одного из примеров выше.
- Откройте терминал в VS Code (Ctrl + `).
- Убедитесь, что активировано виртуальное окружение:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите:
python exceptions_examples.py