Powrót do: Podstawy Testów Automatycznych w Selenium i Python cz. 5 – Profesjonalna konfiguracja projektu
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.
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)!
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.
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 😀 ).