📋 Формулировка задания
Исходное задание из LMS:
-
Деление без ошибок
Напишите функцию, которая выполняет деление двух чисел, введенных пользователем, и обрабатывает возможные ошибки.
Пример вывода:Введите делимое: 345 Введите делитель: 5a Ошибка: Введено некорректное число. -
Логирование ошибок
Перенаправьте в предыдущей задаче вывод ошибок в файлerrors.logв соответствии с форматом ниже.
Пример вывода:2025-02-23 22:38:53,686 - ERROR - test.py - 16 - Ошибка: Введено некорректное число.
🔧 Шаг 0. Подготовка окружения
Перед началом работы над любым заданием курса нужно настроить окружение. Эти шаги одинаковы для всех уроков.
.gitignore, единая история, легко переключаться между уроками.
Создайте (или откройте) рабочую папку
В VS Code нажмите Ctrl+K Ctrl+O → выберите или создайте папку python-fundamentals-practice. Это будет корень вашего учебного репозитория.
# Или в терминале VS Code (Ctrl + `):
mkdir python-fundamentals-practice
cd python-fundamentals-practice
Инициализируйте 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: базовая структура репозитория"
Создайте папку для текущего урока
# Структура: lesson-XX/
mkdir -p lesson-48
cd lesson-48
Создайте виртуальное окружение (venv)
# Windows (PowerShell / CMD)
python -m venv venv
venv\Scripts\activate
# Mac / Linux
python3 -m venv venv
source venv/bin/activate
После активации в начале строки терминала появится (venv). Все дальнейшие команды выполняйте внутри venv.
Создайте ветку для задания
# Вернитесь в корень репозитория
cd ../..
# Создайте и переключитесь на ветку
git checkout -b lesson/48-exceptions-error-handling
# Отправьте ветку на удалённый репозиторий (если настроен)
git push -u origin lesson/48-exceptions-error-handling
Именование веток: lesson/XX-краткое-название. Это позволяет легко находить нужный урок.
🛠️ Шаги выполнения задания
Теперь, когда окружение готово, приступайте к решению.
Шаг 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:
- Убедитесь, что venv активирован.
- Запустите:
python safe_divide.py - Введите
345и5a. Вывод должен быть:Ошибка: Введено некорректное число.
Шаг 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:
- Запустите:
python safe_divide_logged.py - Введите некорректное число.
- Откройте файл
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}")
🧪 Как проверить решение
- Активируйте venv:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите файл:
python homework_48.py. - Проверьте сценарии:
- Корректные числа → выводится результат.
- Некорректное число → выводится сообщение об ошибке и запись появляется в
errors.log. - Делитель равен нулю → выводится сообщение и запись в
errors.log.
🐛 Отладка в VS Code
Если что-то не работает:
- Поставьте точку останова (breakpoint) на строке с
float(dividend). - Нажмите F5 или выберите «Run → Start Debugging».
- На панели Debug следите за значениями переменных
dividendиdivisor. - Если лог не создаётся, проверьте, что
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раньше.