🏠 Домашнее задание

⚡ Суть задания

Домашнее задание состоит из двух задач: безопасное деление двух чисел и перенаправление ошибок в файл errors.log.

Результат: файл с функцией деления, который корректно обрабатывает некорректный ввод и деление на ноль, а ошибки записывает в лог.

📋 Формулировка задания

Исходное задание из LMS:

  1. Деление без ошибок
    Напишите функцию, которая выполняет деление двух чисел, введенных пользователем, и обрабатывает возможные ошибки.
    Пример вывода:
    Введите делимое: 345
    Введите делитель: 5a
    Ошибка: Введено некорректное число.
  2. Логирование ошибок
    Перенаправьте в предыдущей задаче вывод ошибок в файл errors.log в соответствии с форматом ниже.
    Пример вывода:
    2025-02-23 22:38:53,686 - ERROR - test.py - 16 - Ошибка: Введено некорректное число.

🔧 Шаг 0. Подготовка окружения

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

📁 Структура репозитория: мы используем один репозиторий для всех практических работ курса. Это удобнее, чем много отдельных репозиториев: общий .gitignore, единая история, легко переключаться между уроками.
1

Создайте (или откройте) рабочую папку

В VS Code нажмите Ctrl+K Ctrl+O → выберите или создайте папку python-fundamentals-practice. Это будет корень вашего учебного репозитория.

# Или в терминале VS Code (Ctrl + `):
mkdir python-fundamentals-practice
cd python-fundamentals-practice
2

Инициализируйте Git-репозиторий (один раз)

Если папка ещё не является git-репозиторием:

git init

# Создайте базовые файлы
echo "# Python Fundamentals — Практические работы" > README.md
echo "venv/" > .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore
echo ".env" >> .gitignore
echo "*.log" >> .gitignore

git add README.md .gitignore
git commit -m "init: базовая структура репозитория"
3

Создайте папку для текущего урока

# Структура: lesson-XX/
mkdir -p lesson-48
cd lesson-48
4

Создайте виртуальное окружение (venv)

# Windows (PowerShell / CMD)
python -m venv venv
venv\Scripts\activate

# Mac / Linux
python3 -m venv venv
source venv/bin/activate

После активации в начале строки терминала появится (venv). Все дальнейшие команды выполняйте внутри venv.

5

Создайте ветку для задания

# Вернитесь в корень репозитория
cd ../..

# Создайте и переключитесь на ветку
git checkout -b lesson/48-exceptions-error-handling

# Отправьте ветку на удалённый репозиторий (если настроен)
git push -u origin lesson/48-exceptions-error-handling

Именование веток: lesson/XX-краткое-название. Это позволяет легко находить нужный урок.

🛠️ Шаги выполнения задания

Теперь, когда окружение готово, приступайте к решению.

1

Шаг 1: безопасное деление

Создайте файл safe_divide.py и реализуйте функцию деления с обработкой ошибок.

# safe_divide.py
from typing import Optional


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


if __name__ == "__main__":
    dividend_input = input("Введите делимое: ")
    divisor_input = input("Введите делитель: ")
    result = safe_divide(dividend_input, divisor_input)
    if result is not None:
        print(f"Результат: {result}")

Проверка в VS Code:

  1. Убедитесь, что venv активирован.
  2. Запустите: python safe_divide.py
  3. Введите 345 и 5a. Вывод должен быть: Ошибка: Введено некорректное число.
2

Шаг 2: добавьте логирование

Добавьте запись ошибок в файл errors.log с нужным форматом.

# safe_divide_logged.py
import logging
from typing import Optional

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


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


if __name__ == "__main__":
    dividend_input = input("Введите делимое: ")
    divisor_input = input("Введите делитель: ")
    result = safe_divide(dividend_input, divisor_input)
    if result is not None:
        print(f"Результат: {result}")

Проверка в VS Code:

  1. Запустите: python safe_divide_logged.py
  2. Введите некорректное число.
  3. Откройте файл errors.log и убедитесь, что строка содержит время, уровень ERROR, имя файла, номер строки и сообщение.

✅ Полное решение

Ниже приведены обе задачи в одном файле. Совет: попробуйте выполнить задание самостоятельно, прежде чем смотреть ответ.

# homework_48.py
import logging
from typing import Optional

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


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


if __name__ == "__main__":
    dividend_input = input("Введите делимое: ")
    divisor_input = input("Введите делитель: ")
    result = safe_divide(dividend_input, divisor_input)
    if result is not None:
        print(f"Результат: {result}")

🧪 Как проверить решение

  1. Активируйте venv: venv\Scripts\activate (Windows) или source venv/bin/activate (Mac/Linux).
  2. Запустите файл: python homework_48.py.
  3. Проверьте сценарии:
    • Корректные числа → выводится результат.
    • Некорректное число → выводится сообщение об ошибке и запись появляется в errors.log.
    • Делитель равен нулю → выводится сообщение и запись в errors.log.

🐛 Отладка в VS Code

Если что-то не работает:

  1. Поставьте точку останова (breakpoint) на строке с float(dividend).
  2. Нажмите F5 или выберите «Run → Start Debugging».
  3. На панели Debug следите за значениями переменных dividend и divisor.
  4. Если лог не создаётся, проверьте, что logging.basicConfig вызывается до первого использования logging.error.

💾 Сохранение работы

# Добавьте файлы урока
git add lesson-48/

# Сделайте коммит с осмысленным сообщением
git commit -m "lesson-48: исключения и логирование ошибок"

# Отправьте на GitHub / GitLab
git push

💡 Советы и типичные ошибки

  • Не ловите «голый» except: — указывайте конкретные исключения.
  • Проверьте, что файл errors.log создаётся в той же папке, откуда запускается скрипт.
  • Не коммитьте папку venv/ и лог-файлы — они указаны в .gitignore.
  • Если logging.basicConfig не срабатывает, возможно, вы уже вызывали другие методы модуля logging раньше.