Глава 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