Rozdział 23 · Część IV · Wdrażamy SafeSort

Obsługa błędów systemu plików

Specyficzne wyjątki zamiast except Exception: program nie ukrywa rzeczywistych błędów, lecz obsługuje jedynie te oczekiwane.

SafeSort · Część 4 z 6Wdrożenie
GitHubIssue #10 · Project SafeSort Pierwsze wydanie
Handle filesystem errors
Area: FilesystemPriority: Medium

Rzeczywisty system plików jest nieprzewidywalny: plik może zniknąć między skanowaniem i Read, dostęp do katalogu może zostać odrzucony, a dysk może być wadliwy. Python zgłasza takie sytuacje poprzez określone klasy wyjątków i SafeSort wykrywa dokładnie Nie wszystkie są ustawione w rzędzie.

Co się stało → jakie wyjątek
Plik zniknął między krokami
→
FileNotFoundError
Niewystarczające prawa dostępu
→
PermissionError
Inne błędy systemu plików
→
OSError
WyjątekKiedy powstajeJak SafeSort reaguje
FileNotFoundErrorPlik lub katalog znikał między krokamipomija ten wpis, kontynuuje resztę
PermissionErrorBrak wystarczających uprawnień do odczytu lub zapisuPomija ten wpis, zapisuje ostrzeżenie w dzienniku
OSErrorOgólny błąd systemu plików (np. dysk przepełniony)pomija ten wpis, kontynuuje resztę
except Exception — nie jest rozwiązaniem
Przechwycenie except Exception: pass pochłania nie tylko oczekiwane błędy systemu plików, ale także rzeczywiste błędy w samym programie — na przykład literówkę w nazwie zmiennej — i program działałby dalej, jakby nic się nie stało, ukrywając prawdziwy problem. SafeSort wykrywa tylko wyjątki, których faktycznie oczekuje w danym miejscu: FileNotFoundError, PermissionError, OSError — i nigdy nie wykrywa wyjątków bez określenia typu.

Przykład z scanner.py — odczyt katalogu, do którego może nie być uprawnień dostępu:

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

Każda gałąź przechwytuje swój konkretny przypadek, zapisuje wyraźną wiadomość do logu (jaki rodzaj logu jest na następnej stronie) i zwraca kontrolę - skan Reszta katalogów trwa tak, jakby nic się nie stało.

Krótko

  • SafeSort przechwytuje konkretne oczekiwane wyjątki — FileNotFoundError, PermissionError, OSError — zamiast wszystkich.
  • Każde przechwycenie jest oprzewiane wiadomością w logu, a nie cichą ignorancją.
  • Błąd w jednym pliku lub katalogu nie powinien zatrzymywać przetwarzania pozostałych.
Checkpoint · Issue #10
git commit -m "feat: add directory scanner and configuration"
Ten Issue nie ma własnego Pull Request z frazą „Closes #10”PR #15, strona 23-08), a sam Issue #10 został zamknięty ręcznie już po sprawdzeniu, bez automatycznego powiązania. Nie każde zadanie zamyka się osobnym PR. Tak wygląda faktyczna historia repozytorium.
Status prawdziwego Project: Done