09_Ошибки_и_отладка.md - YaroslavGit28/os.sys-PY GitHub Wiki

09. Ошибки и отладка

Этот модуль описывает типичные ошибки в проекте file_manager.py, способы их диагностики и практики безопасной отладки.


9.1. Какие ошибки возможны в проекте

Даже в простом учебном менеджере есть несколько классов ошибок:

  1. Ошибки ввода пользователя:

    • пустая строка вместо имени;
    • ввод имени с разделителями путей (/, \) там, где ожидается только имя;
    • попытка удаления несуществующего файла.
  2. Ошибки файловой системы:

    • создание папки, которая уже существует (FileExistsError);
    • удаление непустой папки через os.rmdir (OSError);
    • недостаточно прав для операции (PermissionError / OSError).
  3. Ошибки системных вызовов (os.system):

    • внешняя команда недоступна;
    • команда выполняется не так, как ожидалось на конкретной ОС;
    • некорректное формирование строки команды.
  4. Логические ошибки:

    • неверное обновление 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. Мини-чеклист отладки

Когда какая-то функция работает “не так”, проверяем по шагам:

  1. Проверить входные данные:

    • что ввёл пользователь;
    • не пустая ли строка;
    • не содержит ли строка запрещённых символов.
  2. Проверить текущий контекст:

    • значение CURRENT_DIR;
    • существует ли целевой путь (exists);
    • тип цели (is_dir / файл).
  3. Проверить системную команду:

    • распечатать сформированную команду;
    • вручную запустить её в терминале;
    • сравнить поведение на Windows/Linux/macOS.
  4. Проверить код возврата внешней команды:

    • 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;
  • таблицу кодов ошибок и короткие рекомендации пользователю.