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