1.1 Występowanie błędów
Błędy (i wyjątki) są nieodłączną częścią programowania. Występują, gdy program napotyka na nieoczekiwane sytuacje, które nie może obsłużyć. W Pythonie istnieje system obsługi wyjątków, który pozwala przechwytywać i obsługiwać błędy, zapobiegając zakończeniu działania programu.
Wyjątki najczęściej występują w następujących sytuacjach:
Błędy składniowe:
Te błędy są wykrywane podczas kompilacji kodu i są związane z niewłaściwą składnią języka Python. Na przykład, brakujące dwukropki lub błędne słowa kluczowe.
if True:
print("Hello")
Błędy czasu wykonania (Runtime Errors):
Te błędy występują podczas wykonywania programu i mogą być spowodowane różnymi przyczynami, takimi jak dzielenie przez zero, dostęp do nieistniejącego indeksu listy, niewłaściwe użycie typów danych itd.
print(1 / 0) # ZeroDivisionError
Błędy logiczne:
Te błędy występują, gdy program działa bez awarii, ale zwraca nieprawidłowy wynik z powodu błędu w logice programu. Błędy logiczne nie powodują wyjątków i są trudniejsze do debugowania.
Błędy logiczne zwykle nazywane są bugami — to jakby pewne niedociągnięcia w funkcjonalności programu. Błędy czasu wykonania nazywane są wyjątkami. Dla każdego takiego błędu Python tworzy specjalny obiekt (wyjątek) i "rzuca" go w program...
1.2 Ścieżka wyjątków
Gdy w Pythonie wystąpi wyjątek, jest on podnoszony po stosie wywołań, dopóki nie zostanie obsłużony. Stos wywołań to sekwencja wywołań funkcji, które doprowadziły do wystąpienia wyjątku.
Mechanizm podnoszenia wyjątków
- Wystąpienie wyjątku: Gdy występuje błąd, Python tworzy obiekt wyjątku.
- Poszukiwanie obsługi wyjątku: Interpreter Pythona rozpoczyna poszukiwania obsługi wyjątku w bieżącym bloku kodu. Jeśli nie znajdzie obsługi, przechodzi do następnego bloku kodu, który wywołał bieżącą funkcję.
- Podnoszenie wyjątku po stosie: Ten proces powtarza się, dopóki nie zostanie znaleziona obsługa lub stos wywołań nie zostanie wyczerpany.
- Zakończenie programu: Jeśli obsługa nie zostanie znaleziona, program kończy swoją pracę i wyświetla komunikat o błędzie.
Przykład:
def func_a():
func_b()
def func_b():
func_c()
def func_c():
print(1 / 0) # Tutaj występuje wyjątek ZeroDivisionError
func_a()
W tym przykładzie wyjątek ZeroDivisionError występuje w funkcji func_c, a następnie jest podnoszony po stosie wywołań przez func_b i func_a. Jeśli nigdzie nie zostanie znaleziona obsługa, program zakończy się z błędem.
1.3 Odczytywanie logów
Gdy program kończy się z powodu nieobsłużonego wyjątku, Python wyświetla ślad stosu (traceback), który pomaga programistom zrozumieć, co poszło nie tak. Ślad stosu zawiera informacje o sekwencji wywołań funkcji, które doprowadziły do wystąpienia wyjątku i może być analizowany w celu debugowania programu.
Przykład śladu stosu
Traceback (most recent call last):
File "example.py", line 10, in
func_a() File "example.py", line 2, in func_a func_b() File "example.py", line 5, in func_b func_c() File "example.py", line 8, in func_c print(1 / 0) ZeroDivisionError: division by zero
Analiza śladu stosu
- Typ wyjątku i komunikat: Na końcu śladu wskazany jest typ wyjątku i komunikat. W przedstawionym przykładzie to
ZeroDivisionError: division by zero. - Sekwencja wywołań: Ślad stosu pokazuje sekwencję wywołań funkcji. W naszym przykładzie błąd wystąpił w linii
print(1 / 0)w funkcjifunc_c, która została wywołana zfunc_b, które z kolei zostało wywołane zfunc_a. - Pliki i linie kodu: W każdej linii śladu wskazano plik i numer linii, gdzie wystąpiło wywołanie. To pomaga szybko znaleźć i naprawić błąd w kodzie.
Praktyczne wykorzystanie śladu stosu
Ślad stosu jest ważnym narzędziem do debugowania i analizy programów. Pomaga programistom zrozumieć przyczynę wystąpienia błędu i znaleźć miejsce w kodzie, gdzie wystąpił. Oto kilka porad dotyczących wykorzystania śladu stosu:
- Czytanie od dołu w górę: Zacznij analizę od najniższego wywołania w śladzie, ponieważ jest to miejsce, gdzie wystąpił wyjątek.
- Sprawdzenie wszystkich wywołań: Zapoznaj się z wszystkimi wywołaniami w śladzie, aby zrozumieć ścieżkę, po której przekazywano wyjątek.
- Poprawa kodu: Wykorzystaj informacje ze śladu do poprawy kodu i zapobiegania podobnym błędom w przyszłości.
Więcej o wyjątkach dowiesz się w kolejnych wykładach.
GO TO FULL VERSION