🏋️ Раздел тренировки
Выполните задания в отдельных файлах. Используйте конкретные исключения, guard clauses и логирование там, где это уместно.
Задание 1. Обработка ввода пользователя
Условие: напишите программу, которая запрашивает у пользователя число и обрабатывает возможные ошибки ввода, пока не получит корректное число.
Пример вывода:
Введите число: qwe
Ошибка: Введите корректное число.
Введите число: 12.5
Вы ввели число: 12.5
Подсказка: используйте float() и бесконечный цикл с try/except ValueError.
Задание 2. Проверка возраста
Условие: напишите функцию check_age(age: int), которая проверяет, что возраст не меньше 18 лет. Если возраст меньше — возбудите ValueError с понятным сообщением.
Пример вывода:
Введите возраст: 17
Ошибка: Возраст должен быть 18 лет и старше.
Подсказка: используйте raise и обработайте исключение в основной программе.
Задание 3. Безопасное деление
Условие: напишите функцию safe_divide(dividend: str, divisor: str), которая выполняет деление двух чисел, введённых пользователем, и обрабатывает возможные ошибки.
Пример вывода:
Введите делимое: 345
Введите делитель: 5a
Ошибка: Введено некорректное число.
Ожидаемое поведение: обработать ValueError (некорректное число) и ZeroDivisionError (деление на ноль).
Задание 4. Пользовательское исключение для счёта
Условие: создайте класс исключения InsufficientFundsError и функцию withdraw(balance: float, amount: float) -> float. Если amount > balance, возбудите исключение. Иначе верните новый баланс.
Пример вывода:
Баланс: 100, снятие: 150
Ошибка: Недостаточно средств: баланс 100, требуется 150
Задание 5. Логирование ошибок
Условие: измените функцию из задания 3 так, чтобы при ошибках сообщения записывались в файл errors.log с форматом:
2025-02-23 22:38:53,686 - ERROR - module.py - 16 - Ошибка: Введено некорректное число.
Подсказка: используйте logging.basicConfig с параметрами filename, format и level.
Задание 6. Использование assert (★ дополнительно)
Условие: напишите функцию apply_discount(price: float, discount: float) -> float. Используйте assert, чтобы убедиться, что цена и скидка неотрицательны, а скидка не больше 1.
Пример: apply_discount(100.0, 0.2) → 80.0; apply_discount(100.0, 1.5) → AssertionError.
assert не входит в исходную лекцию, но используется для внутренних инвариантов.