PHP: rzucanie wyjątków

#jedenasta37 Jak działają wyjątki w PHPie? Rzuca się je, przechwytuje, obsługuje, co to w ogóle znaczy? To po kolei!

Już wiesz..

..czym są klasy, metody, co to jest dziedziczenie, umiesz korzystać z instrukcji sterującej if i pisać funkcje.

Jeśli nie znasz jeszcze tych pojęć i nie rozumiesz ich, możesz mieć kłopot ze zrozumieniem dalszej części artykułu, ale i tak przeczytaj – oswoisz się z pojęciami, coś zapamiętasz i wyrobisz sobie ogólne wyobrażenie. Wielu osobom w branży już to wystarcza do wypowiadania się na spotkaniach teamu, a co ciekawsze – tyle wystarczy, żeby skutecznie zabrać głos, doradzić, wskazać kierunek. Jak masz ogólne pojęcie / wyobrażenie, że coś istnieje, to resztę zawsze możesz doczytać!

Kiedy stosujemy wyjątki?

Zadaniem programisty jest przewidzieć wszystkie miejsca w systemie, które mogą się wykrzaczyć. A uwierzcie mi, że wykrzacza się coś często. Większość takich przewidzianych nieprzewidzianych sytuacji obsługujemy w sposób niezauważony dla użytkownika – taki jest ideał i często się to udaje, ale bywa też tak, że nie jesteśmy w stanie obsłużyć – pojawia się taki błąd, który uniemożliwia dalsze działanie skryptu. Taki błąd nazywamy wyjątkiem. Trzeba go przechwycić na wyższym poziomie i elegancko obsłużyć, zwykle w ramach obsługi wyświetlamy użytkownikowi ładny komunikat, że coś poszło nie tak. Albo pomijamy jakąś część skryptu, wycofujemy z bazdy dane, które już częściowo zostały w niej zapisane, a byłyby niespójne itp. Myślę, że w kursie zrobimy sobie obsługę wyjątkami kilku realnych sytuacji w ramach ćwiczeń.

Lekki przykład

Kiedy np. mamy funkcję, której zadaniem jest dzielenie dwóch liczb: funkcja przyjmuje dzielną i dzielnik, zwraca wynik, to co może pójść nie tak? Zastanów się przez moment, nie leć dalej z czytaniem.

Jesteś osobą, która ma za zadanie napisać taki fragment kodu: napisz funkcję, która otrzymuje dwie liczby i zwraca wynik dzielenia. Co piszesz?

public function quotient($a, $b) {
    
    return $a / $b;
}

Działa? No działa, ale może zdarzyć się sytuacja, w której nie zadziała – przewidziałaś ją już?

Jeśli w trakcie wykonywania skryptu Twoja piękna funkcja dostanie $b = 0, dzielenie przez $b będzie niemożliwe, bo jest niewykonalne. I co wtedy? To jest dobre miejsce na wyjątek.

Rzucanie czaru: „wyjątek”

Żeby wywołać wyjątek, musimy go rzucić, robi się to za pomocą słowa kluczowego throw po którym następuje utworzenie nowego obiektu klasy Exception lub jej pochodnej (takiej, co po niej dziedziczy) i przekazanie jej komunikatu błędu (można przekazać więcej w kontruktorze Exception, ale o tym innym razem). Utworzony obiekt wyjątku jest wtedy rejestrowany i istnieje w pamięci procesu, więc też będziemy mogli się w przyszłości do niego odnieść. Wygląda to tak:

throw new Exception('Division by zero.');

Oczywiście, najpierw sprawdzamy, czy $b = 0, jeśli tak, rzucamy wyjątek, co przerwie dalsze działanie funkcji i odda sterowanie wyżej. Jeśli nie, funkcja zostanie wykonana do końca i dopiero return zwróci wynik i odda sterowanie, czyli wszystko zgodnie z planem. Funkcja z dodanym czarem wyjątku:

public function quotient($a, $b) {
    if($b == 0) {
        throw new Exception('Division by zero.');
    } 

    return $a / $b;
}

Co dalej robimy z tym typkiem Exceptionem?

To jest bardzo dobre pytanie! Nie można sobie rzucać klątw w systemie ot tak nieodpowiedzialnie, nie łapiąc ich zaraz troszkę wyżej. Wyjątku użytkownik końcowy widzieć nie powinien, bo sypie mu to kodami błędu po ekranie i internety się potem śmieją z takiego programisty.

Za tydzień o przechwytywaniu i obsługiwaniu wyjątków! Miało być dzisiaj, ale pomyślałam, że krótsze wpisy łatwiej czytać zabieganym matkom i ojcom, zgadzacie się z tym, czy lepiej puścić całą wiedzę w jednym bardzo długim wpisie? Dajcie znać co myślicie! Mam nadzieję, że mój oplatający i rozbudowany sposób opowiadania pomaga, a nie przeszkadza.

#programujBoWarto

One thought on “PHP: rzucanie wyjątków

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *