430
Rozdział 11.
Co poszło nie tak?
Poznawanie wyjątków za pomocą modułu sys
Biblioteka standardowa zapewnia moduł o nazwie
sys
, który oferuje dostęp do wnętrzności
interpretera (zestawu zmiennych i funkcji dostępnych w czasie wykonania).
Jedną z takich funkcji jest
exc_info
, która dostarcza informacji na temat obecnie
obsługiwanego wyjątku. Wywołanie tej funkcji powoduje zwrócenie krotki zawierającej
trzy wartości. Pierwsza z nich wskazuje
typ
wyjątku, druga zawiera szczegóły dotyczące
jego
wartości
, a trzecia przechowuje
obiekt śladu
zapewniający dostęp do komunikatu
tracebacku (gdybyś z jakichś powodów go potrzebował). Jeśli nie ma żadnego dostępnego
wyjątku, funkcja
exc_info
zwraca pythonową wartość null w przypadku każdej wartości
należącej do krotki, co wygląda tak:
(None, None, None)
.
Wiedząc to wszystko, poeksperymentujmy trochę w wierszu poleceń środowiska IDLE.
W ramach przedstawionej poniżej sesji napisaliśmy trochę kodu, który zawsze doprowadzi
do błędu czasu wykonania (ponieważ dzielenie przez zero
nigdy nie jest dobrym pomysłem).
W
zestawie klauzuli
except
wyłapującej wszystkie wyjątki wykorzystaliśmy funkcję
sys.exc_info
, aby wydobyć i wyświetlić dane związane z bieżącym wyjątkiem.
Pamiętaj o zaimportowaniu modułu sys.
Dzielenie przez zero NIGDY nie jest dobrym pomysłem... a
gdy
wykonasz
taką operację w swoim kodzie, pojawi się wyjątek.
Wydobądźmy i wyświetlmy dane
związane z bieżącym wyjątkiem.
Tutaj widać dane związane z
naszym
wyjątkiem,
które potwierdzają,
że
mamy
do czynienia z
problemem
dzielenia
przez zero.
...
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
...
Przypomnij sobie
hierarchię
wyjątków
przedstawioną
wcześniej w tym rozdziale.
Aby dowiedzieć się więcej na
temat modułu sys, odwiedź
stronę https://docs.python.
org/3/library/sys.html.
Można wgłębić się bardziej w obiekt tracebacku, aby dowiedzieć się więcej o tym, co się
właśnie stało, ale wydaje się to zbyt pracochłonne, prawda? Wszystkim, czego nam tak
naprawdę potrzeba, jest informacja na temat typu zgłoszonego wyjątku.
Aby
uprościć to zadanie (a zarazem ułatwić Ci życie), język Python rozszerza składnię
instrukcji
try-except
, sprawiając, że dostęp do informacji zwracanych przez funkcję
sys.exc_info
realizowany jest w bardziej wygodny sposób, a więc bez zmuszania Cię do
pamiętania o importowaniu modułu
sys
i użerania się z krotką zwracaną przez tę funkcję.
Przypomnij sobie informację przedstawioną kilka stron temu. Zgodnie z nią wyjątki
mają pewną hierarchię, w której każdy z nich dziedziczy po jednym wyjątku, noszącym
nazwę
Exception
. Skorzystajmy z istnienia tej hierarchii, aby napisać na nowo nasz kod
obsługi wszystkich wyjątków.

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.