Obsługa wyjątków

Istnieją dwa typy błędów, które można napotkać podczas pisania programów. Pierwszą grupę stanowią błędy składniowe, które występują, gdy programista popełni błąd w strukturze wyrażenia bądź instrukcji. Poniższy kod pętli for jest niepoprawny, ponieważ każde wyrażenie musi być zakończone dwukropkiem.

>>> for i in range(10)
SyntaxError: invalid syntax (<pyshell#61>, line 1)

W tej sytuacji interpreter Pythona natrafił na instrukcję, której nie jest w stanie przetworzyć, gdyż nie stosuje się ona do reguł syntaktycznych języka. Błędy składniowe dość często występują na początku nauki języka programowania.

Drugim typem błędów są tzw. błędy logiczne, które ujawniają się podczas działania programu w fomie nieprawidłowej pracy lub błędnych wyników. Wynikają one z powodu błędnie opracowanego algorytmu lub jego translacji. W pewnych sytuacjach błędy logiczne mogą prowadzić do krytycznych sytuacji jak dzielenie przez 0, czy próba dostępu do elementu listy z poza jej zakresu. Może to spowodować przerwanie wykonywanego programu. Ten rodzaj błędu określa się jako wyjątek.

Zwykle początkujący programiści postrzegają wyjątki jako błędy niekontrolowane, fatalne, które powodują nieoczekiwane zakończenie działania aplikacji. Większość języków programowania posiada jednakże narzędzia, dzięki którym progrmista jest w stanie interweniować w tych sytuacjach jeśli się na to zdecyduje. Co więcej, możliwe jest stworzenie własnych wyjątków, które mogą monitorować przebieg pracy programu i w momencie wystąpienia problemu odpowiednio zareagować.

W chwili wystąpienia wyjątku mówimy o jego “zgłoszeniu“. Możesz “obsłużyć“ wyjątek, który został zgłoszony poprzez instrukcję try. Na przykład rozpatrzmy poniższy kod, w którym użytkownik poproszny jest o podanie liczby całkowitej, która następnie jest spierwiastkowana przy użyciu funkcji z biblioteki matematycznej. Jeśli wprowadzona liczba jest większa lub równa zero wyświetlony zostaje wynik operacji. Jednak, gdy użytkownik poda liczbę ujemną funkcja pierwiastkująca zwróci wyjątek ValueError.

>>> anumber = int(input("Please enter an integer "))
Please enter an integer -23
>>> print(math.sqrt(anumber))
Traceback (most recent call last):
  File "<pyshell#102>", line 1, in <module>
    print(math.sqrt(anumber))
ValueError: math domain error
>>>

W celu obsłużenia tego wyjątku należy wywołać funkcję print z bloku kodu, związanego z try. Powiązany z nim blok except “wychwyci” wyjątek i wyświetli wiadomość zwrotną użytkownikowi w momencie wystąpienia wyjątku. Przykładowo:

>>> try:
       print(math.sqrt(anumber))
    except:
       print("Bad Value for square root")
       print("Using absolute value instead")
       print(math.sqrt(abs(anumber)))

Bad Value for square root
Using absolute value instead
4.79583152331
>>>

wykryje fakt zgłoszenia wyjątku przez funkcję sqrt i wykona operacje zawarte w bloku catch: wypisze informację zwrotną użytkownikowi, a operacji pierwiastkowania przeprowadzi z wartości absolutnej podanej liczby. Oznacza to, że program nie przerwie swojego działania, ale przejdzie do kolejnego wyrażenia w sposób zaplanowany.

Programista może również zdefiniować własne wyjątki poprzez instrukcję raise. Zamiast próby obliczenia pierwiastka liczby ujemnej można najpierw sprawdzić jej znak i zgłosić własny wyjątek. Fragment kodu poniżej pokazuje utworzenie nowego, zdefiniowanego wyjątku RuntimeError. Zwróc uwagę, że w tym przypadku program również zakończy swoje działanie, ale w sposób przewidziany i kontrolowany przez programistę.

>>> if anumber < 0:
...    raise RuntimeError("You can't use a negative number")
... else:
...    print(math.sqrt(anumber))
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
RuntimeError: You can't use a negative number
>>>

Istnieje wiele różnych wyjątków poza pokazanym RuntimeError, które można zgłosić bezpośrednio z kodu. Zapoznaj się z instrukcją obsługi Python w celu poznania wszystkich dostępnych wyjątków oraz sposobie tworzenia własnych.

Następna część - Defining Functions