jesteś tutaj�
431
Obsługa wyjątków
Ten kod działa, ale
tak naprawdę nie daje
nam wiele informacji
o nieoczekiwanym
wyjątku.
...
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
...
Przypomnij sobie
hierarchię wyjątków
przedstawioną
wcześniej
w tym rozdziale.
W przeciwieństwie do „gołej”,
przechwytującej wszystkie wyjątki
instrukcji except, która została
pokazana powyżej, ta sprawia,
że obiekt wyjątku zostaje przypisany
do zmiennej
err.
Wartość zmiennej err jest następnie
wykorzystana jako część komunikatu
przyjaznego użytkownikowi (jako że
dobrym pomysłem jest raportowanie
wszystkich pojawiających się wyjątków).
Zrewidowany kod obsługi wszystkich wyjątków
Przyjrzyj się swojemu (przedstawionemu poniżej) bieżącemu kodowi, w którym jawnie wskazałeś dwa
rodzaje wyjątków, jakie postanowiłeś obsłużyć (błędy
FileNotFoundError
oraz
PermissionError
),
jak również zapewniłeś zestaw związany z ogólną, przechwytującą wszystko klauzulą
except
.
Zauważ, że odwołując się do
konkretnego wyjątku, wskazywaliśmy go za pomocą nazwy po
słowie kluczowym
except
. W podobny sposób można wskazywać całe klasy wyjątków, używając
dowolnych nazw występujących w hierarchii.
Jeśli jesteś na przykład zainteresowany tym, czy został zgłoszony jakiś wyjątek arytmetyczny (a nie
— konkretnie — tym, że wystąpił błąd dzielenia przez zero), możesz skorzystać z klauzuli
except
ArithmeticError
, dzięki której przechwycisz błędy
FloatingPointError
,
OverflowError
oraz
ZeroDivisionError
, gdy tylko wystąpią. Podobnie, jeśli użyjesz klauzuli
except Exception
,
będziesz przechwytywał
dowolne błędy.
W jaki jednak sposób może Ci to pomóc, zwłaszcza że przechwytujesz już wszystkie błędy za
pomocą „gołej” instrukcji
except
? To prawda, przechwytujesz. Możesz jednak rozszerzyć klauzulę
except Exception
za pomocą słowa kluczowego
as
, pozwalającego Ci przypisać obiekt bieżącego
wyjątku do zmiennej (często stosuje się w tej roli zmienną o nazwie
err
) i utworzyć bardziej
pouczający komunikat błędu. Przyjrzyj się kolejnej, przedstawionej poniżej wersji kodu, w której
została zastosowana konstrukcja
except Exception as
.
432
Rozdział 11.
Ostatni test
Jeśli odpowiedni plik istnieje, lecz nie masz uprawnień, aby uzyskać do niego dostęp, zgłoszony zostaje inny wyjątek.
Wszelkie inne wyjątki zostają obsłużone za pomocą wychwytującej wszystko klauzuli except,
której zestaw wyświetla przyjazny komunikat z informacją o błędzie.
Wreszcie, gdy wszystko jest w porządku, zestaw instrukcji try zostaje wykonany bez błędów,
a zawartość pliku jest wyświetlana na ekranie.
Plik myfile.txt
nie istnieje.
Plik istnieje,
lecz nie można
go odczytać.
Wystąpił jakiś inny
wyjątek. W tym
przypadku coś, co
uważałeś za plik,
w rzeczywistości
okazało się folderem.
Sukces! Nie wystąpiły
żadne wyjątki, dzięki
czemu zestaw
instrukcji try został
wykonany w całości.
Jazda próbna
Wprowadziwszy tę — już ostatnią — zmianę w kodzie prezentującym możliwości instrukcji try-except, potwierdźmy,
że wszystko działa zgodnie z naszymi oczekiwaniami, zanim powrócimy do aplikacji WWW
vsearch4web.py
i zastosujemy
w kodzie modyfikacje związane z obsługą wyjątków.
Zacznijmy od sprawdzenia, czy nasz kod wyświetla odpowiedni komunikat, gdy nie ma wymaganego pliku.
Get Python Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.