09_Ошибки_и_отладка.md - YaroslavGit28/os.sys-PY GitHub Wiki
09. Ошибки и отладка
Этот модуль описывает типичные ошибки в проекте file_manager.py, способы их диагностики и практики безопасной отладки.
9.1. Какие ошибки возможны в проекте
Даже в простом учебном менеджере есть несколько классов ошибок:
-
Ошибки ввода пользователя:
- пустая строка вместо имени;
- ввод имени с разделителями путей (
/,\) там, где ожидается только имя; - попытка удаления несуществующего файла.
-
Ошибки файловой системы:
- создание папки, которая уже существует (
FileExistsError); - удаление непустой папки через
os.rmdir(OSError); - недостаточно прав для операции (
PermissionError/OSError).
- создание папки, которая уже существует (
-
Ошибки системных вызовов (
os.system):- внешняя команда недоступна;
- команда выполняется не так, как ожидалось на конкретной ОС;
- некорректное формирование строки команды.
-
Логические ошибки:
- неверное обновление
CURRENT_DIR; - пропуск проверки существования пути;
- смешение абсолютных и относительных путей.
- неверное обновление
9.2. Уже встроенные защиты в текущем коде
В проекте предусмотрены базовые проверки:
- запрет пустого имени в
make_dir()иremove_item(); - запрет путей вместо имени в
make_dir()иremove_item(); - проверка
exists()перед удалением; - обработка исключений через
try/except OSError.
Эти проверки не “идеальные”, но для учебного проекта дают понятный, безопасный минимум.
9.3. Что происходит без обработчиков ошибок (антипример)
Если делать операции без проверок:
import os
name = input("Имя папки: ")
os.mkdir(name)
то при повторном запуске легко получить падение:
FileExistsError: [Errno 17] File exists(Linux/macOS);- аналогичную ошибку в Windows.
В учебном проекте такие исключения перехватываются и показываются пользователю как человеко-понятное сообщение.
9.4. Мини-чеклист отладки
Когда какая-то функция работает “не так”, проверяем по шагам:
-
Проверить входные данные:
- что ввёл пользователь;
- не пустая ли строка;
- не содержит ли строка запрещённых символов.
-
Проверить текущий контекст:
- значение
CURRENT_DIR; - существует ли целевой путь (
exists); - тип цели (
is_dir/ файл).
- значение
-
Проверить системную команду:
- распечатать сформированную команду;
- вручную запустить её в терминале;
- сравнить поведение на Windows/Linux/macOS.
-
Проверить код возврата внешней команды:
os.systemвозвращает код завершения;- ненулевой код = команда с ошибкой.
9.5. Полезный приём: временное логирование шагов
Даже без сторонних библиотек можно временно логировать критичные точки:
print(f"[DEBUG] CURRENT_DIR={CURRENT_DIR}")
print(f"[DEBUG] target={target}, exists={target.exists()}, is_dir={target.is_dir() if target.exists() else None}")
Это помогает понять, где именно расходится ожидание и реальность.
После диагностики такие сообщения лучше удалить или отключить.
9.6. Диаграмма: цикл отладки
flowchart TD
A[Симптом: ошибка/неверное поведение] --> B[Проверить входные данные]
B --> C[Проверить CURRENT_DIR и target]
C --> D[Проверить вызов os/os.system]
D --> E[Получить исключение или код возврата]
E --> F[Исправить причину]
F --> G[Повторно проверить сценарий]
G --> H{Проблема решена?}
H -- Нет --> B
H -- Да --> I[Закрепить проверкой/документацией]
9.7. Частые случаи и решения
Случай A: “Не удалось удалить папку”
Причина:
os.rmdirудаляет только пустые директории.
Решение:
- сначала очистить содержимое, потом удалять;
- либо в учебном проекте оставить поведение как есть и вывести понятное сообщение.
Случай B: “Проводник не открывается”
Причины:
- команда собрана неправильно;
- путь содержит спецсимволы и не заключён в кавычки;
- запуск не на Windows при команде
explorer.
Решение:
- печатать команду перед
os.system; - использовать кавычки вокруг пути;
- ветвить команду по ОС.
Случай C: “Переход в папку не сработал”
Причины:
- путь не существует;
- введено имя файла вместо папки;
- относительный путь вычислен неверно.
Решение:
- проверять
new_path.is_dir(); - при неуспехе печатать рассчитанный
new_pathдля диагностики.
9.8. Что можно улучшить дальше
Для учебной эволюции проекта можно добавить:
- общий обработчик ошибок уровня
main; - режим “подробной диагностики” (
DEBUG = True/False); - функцию проверки команд before-run;
- таблицу кодов ошибок и короткие рекомендации пользователю.