Глава 23 · Часть IV · Реализуем SafeSort

Обрабатываем ошибки файловой системы

Конкретные исключения вместо except Exception: программа не скрывает реальные ошибки, а обрабатывает только ожидаемые.

SafeSort · Часть 4 из 6Реализация
GitHubIssue #10 · Project «SafeSort — первый релиз»
Handle filesystem errors
Area: FilesystemPriority: Medium

Реальная файловая система непредсказуема: файл может исчезнуть между сканированием и чтением, доступ к каталогу может быть запрещён, диск может оказаться неисправен. Python сообщает о таких ситуациях через конкретные классы исключений, и SafeSort ловит именно их — не всё подряд.

Что произошло → какое исключение
Файл пропал между шагами
→
FileNotFoundError
Недостаточно прав доступа
→
PermissionError
Другая ошибка файловой системы
→
OSError
ИсключениеКогда возникаетКак реагирует SafeSort
FileNotFoundErrorФайл или каталог исчез между шагамиПропускает эту запись, продолжает остальные
PermissionErrorНедостаточно прав для чтения или записиПропускает эту запись, пишет предупреждение в журнал
OSErrorОбщая ошибка файловой системы (например, диск переполнен)Пропускает эту запись, продолжает остальные
except Exception — не решение
Перехват except Exception: pass проглотил бы не только ожидаемые ошибки файловой системы, но и настоящие ошибки в самой программе — например, опечатку в имени переменной, — и программа продолжила бы работать, как ни в чём не бывало, скрывая реальную проблему. SafeSort перехватывает только те исключения, которые действительно ожидает в конкретном месте: FileNotFoundError, PermissionError, OSError — и ни разу не перехватывает исключения без указания типа.

Пример из scanner.py — чтение каталога, для которого может не быть прав доступа:

src/safesort/scanner.py
try:
    entries = list(directory.iterdir())
except PermissionError:
    logger.warning("Permission denied, skipping directory: %s", directory)
    return
except FileNotFoundError:
    logger.warning("Directory vanished during scan, skipping: %s", directory)
    return
except OSError as exc:
    logger.warning("Could not read directory %s: %s", directory, exc)
    return

Каждая ветка перехватывает свой конкретный случай, пишет понятное сообщение в журнал (что это за журнал — на следующей странице) и возвращает управление — сканирование остальных каталогов продолжается как ни в чём не бывало.

Коротко

  • SafeSort перехватывает конкретные ожидаемые исключения — FileNotFoundError, PermissionError, OSError — а не всё подряд.
  • Каждый перехват сопровождается сообщением в журнал, а не молчаливым игнорированием.
  • Ошибка на одном файле или каталоге не должна останавливать обработку остальных.
Чекпойнт · Issue #10
git commit -m "feat: add directory scanner and configuration"
У этого Issue нет собственного Pull Request с фразой «Closes #10». Обработка ошибок файловой системы попала в тот же коммит, что и сканер (PR #15, страница 23-08), а сам Issue #10 закрыли вручную уже после проверки, без автоматической связки. Не каждая задача закрывается отдельным PR. Так выглядит фактическая история репозитория.
Статус в реальном Project: Done