Coś poszło nie po naszej myśli… wyjątki oraz konstrukcja try… except w Pythonie

Zapewne miałeś już do czynienia z niejednym błędem w kodzie i wielolinijkowym elaboratem jaki się przy tym pojawia. Co uruchamia akcję, która powoduje pojawienie się stacktrace na naszej konsoli?

Wyjątek (z ang. exception) czyli wszelkie niedozwolone i nieprzewidziane akcje jakie wystąpiły w kodzie. Wyjątki powinny być złapane i obsłużone, gdyż każdy niezłapany, nieobsłużony wyjątek (z ang. unhandled exceptions), albo inaczej zwany nieoczekiwany wyjątek (z ang. unexpected exception) zatrzymuje, natychmiast i nieodwracalnie, działanie naszego skryptu lub programu.

TIP: Często pojęcie niezłapany wyjątek stosuje się zamiennie z nieoczekiwany wyjątek.

Wywołujemy wyjatek

Jak w praktyce wygląda wyjątek? Najprostszym przykładem może być prosty kod, odpowiedzialny za dzielenie dwóch liczb, z czego liczba w mianowniku będzie miała wartość 0. Jak wiemy z matematyki (kto zna “Nigdy cholero nie dziel przez zero?), taka operacja jest niedozwolona a w programowaniu kończy się właśnie wyjątkiem. Przykładowy skrypt może wyglądać w następujący sposób:

a = 1
b = 0

result = a / b

Po jego uruchomieniu (np. korzystając z dobrodziejstw scratches – Otwieranie widoku Scratches i tworzenie pliku Scratches) dostaniemy wyjątek o następującej treści:

Traceback (most recent call last):
  File "C:/Users/jaktestowac/.PyCharmCE2018.2/config/scratches/exceptions_sample.py", line 4, in <module>
    result = a / b
ZeroDivisionError: division by zero

Process finished with exit code 1

Czyli operacja dzielenia przez zero jest niedozwolona i wyjątek ZeroDivisionError spowodował zatrzymanie wykonywania skryptu.

Znane wyjątki w automatach

Przykładowe wyjątki z jakimi możesz się spotkać to:

  • gdy element na stronie nie zostanie odnaleziony przez webdrivera – wtedy występuje NoSuchElementException, czyli w wolnym tłumaczeniu Brak Szukanego Elementu,
  • a gdy nasz XPath jest niepoprawnie skonstruowany to zobaczymy InvalidSelectorException,
  • w przypadku gdy asercja się nie powiedzie, wtedy zwróci błąd i wystąpi wyjątek o nazwie AssertionError,
  • przy próbie otwarcia nieistniejącego pliku może wystąpić FileNotFoundError,
  • bardziej przyziemne błędy podczas operacji matematycznych – ZeroDivisionError, czyli błąd podczas dzielenia przez zero, albo ValueError, czyli błąd wartości, np gdy próbujemy przekonwertować napis tekst na liczbę,
  • i wiele, wiele innych…

Jakie wyjątki łapać i po co to robić?

Jakie błędy i wyjątki możemy łapać konstrukcją try… except? Wszystkie (lub jakie zdefiniujemy)!

TIP: Odpowiednikiem konstrukcji try… except w innych językach (C#, Java, JavaScript) jest try… catch.

Każdy rodzaj niedozwolonej akcji ma swój wyjątek. Pozwala to na ich łatwe filtrowanie i podejmowanie działań względem wybranych typów.

TIP: Więcej o typach wyjątków w Pythonie znajdziesz na stronie Built-in Exceptions, ale pamiętaj, że pakiet może mieć własny zestaw błędów 😉 Przykładowo, wyjątki jakie występują w pakiecie selenium znajdziesz na stronie WebDriver API – Exceptions.

Teraz należałoby zadać najważniejsze pytanie

Po co łapać wyjątki?

Wyjątki łapiemy, gdyż czasem sami chcemy wykonać jakieś akcje, gdy wystąpił nieoczekiwany błąd (czyli właśnie wyjątek!). Tu należy mocno zaakcentować, że nieobsłużone (czyli niezłapane) wyjątki zatrzymują natychmiast i nieodwracalnie działanie naszego skryptu, co w wielu przypadkach może być niepożądanym działaniem.

Przykładowo, w przypadku gdy dany element nie wystąpi na stronie, to zamiast kończyć od razu działanie programu, możemy zechcieć zapisać stosowne informacje do pliku, wyświetlić dodatkowe informacje na konsoli, albo… zrobić zrzut ekranu (o tym już w następnej sekcji 😀 ).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *