Глава 23 · Часть IV · Реализуем SafeSort
Обрабатываем ошибки файловой системы
Конкретные исключения вместо except Exception: программа не скрывает реальные ошибки, а обрабатывает только ожидаемые.
SafeSort · Часть 4 из 6Реализация
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