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
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ątek | Kiedy powstaje | Jak SafeSort reaguje |
|---|---|---|
| FileNotFoundError | Plik lub katalog znikał między krokami | pomija ten wpis, kontynuuje resztę |
| PermissionError | Brak wystarczających uprawnień do odczytu lub zapisu | Pomija ten wpis, zapisuje ostrzeżenie w dzienniku |
| OSError | Ogó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