""" Урок 48. Исключения: обработка ошибок — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/48-exceptions-error-handling/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-48.py """ # ==================================================================== # Пример 1. Базовый try/except # ==================================================================== # example_01_basic.py try: result = 10 / 0 print("Эта строка не выполнится") except ZeroDivisionError: print("Ошибка: деление на ноль!") print("Программа продолжает работу") # ==================================================================== # Пример 2. Несколько обработчиков # ==================================================================== # 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. Доступ к сообщению об ошибке # ==================================================================== # 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 # ==================================================================== # 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) # ==================================================================== # Пример 8. Проверка через 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 # ==================================================================== # Пример 9. Логирование в консоль # ==================================================================== # 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)