PHP - obsługa wyjątków w PHP

DZIAŁANIE: Problem o kodzie : 42 oraz komunikacie Mamy tutaj niewiarygodny wyjątek!!
W pliku /homez.106/soundpag/www/kurs_php/kurs/189wyjatki_klasa_exception.php5 a dokładnie w wierszu 17
exception 'Exception' with message 'Mamy tutaj niewiarygodny wyjątek!!' in /homez.106/soundpag/www/kurs_php/kurs/189wyjatki_klasa_exception.php5:17 Stack trace: #0 {main}
 

Kod:

Ewentualne Objaśnienia:

Obsługa wyjątków, błędów jest w PHP całkiem nowym ( choć już nie tak jak na przykład 2 lata temu ) rozwiązaniem. Podstawowym elementem w obsłudze wyjątków jest wykonywanie kodu wewnątrz bloku try o strukturze :

try
{
    // kod
}

Jeżeli w takim bloku coś zostanie nieprawidłowo wykonane - mamy możliwość wykonania tzw. zgłoszenie wyjątku . W PHP wyjątki powinny być zgłaszane ręcznie (muszą) - operacja taka wykonywana jest w sposób :

throw new Exception('komunikat', kod);

Throw to pewna konstrukcja PHP ( nie funkcja ) wywołująca obsługę wyjątków, do której należy przekazać wartość, jaka argument należy podać obiekt.
Prostym rozwiązaniem jest utworzenie obiektu wbudowanej w PHP klasy Exception. Posiada ona 2 opcjonalne argumenty - komunikat błędu oraz kod.

W naszym kodzie po bloku try potrzeba nam blok catch wyglądający :

catch (typ wyjątek) // na przykład catch (Exception $e)
{
    // obsługa danego wyjątku
}

Dla jednego bloku try możemy mieć więcej niż 1 blok catch - jest to logiczne kiedy każdy z tych bloków powinien obsługiwać inny typ wyjątku.
Obiekt, który przekazujemy do bloku catch to ten sam obiekt przekazywany do instrukcji throw. Wyjątek może być różnego typu, ale dobrym rozwiązaniem jest używanie wspomnianej klasy Exception lub też własnych klas, które z niej dziedziczą.

Po zgłoszeniu wyjątki PHP szuka odpowiedniego bloku catch, jeżeli jest ich więcej - obiekty przekazywane do nich powinny być różnych typów, dzięki czemu PHP wie jakiemu blokowi przekazać sterowanie.

No i mamy jeden przykład, którego działanie widzicie na górze a troszkę niżej kod, zobaczmy :
- w bloku try zgłaszany jest wyjątek - poprzez throw jak wspominałem, jak widać tworzymy obiekt wbudowanej klasy Exception oraz przekazujemy 2 parametry czyli jak mówiłem komunikatu oraz kod wyjątku czy tam błędu. Wiadomo, że taki zapis jest bezsensowny bo wyjątek jest zgłaszany zawsze - w praktyce trzeba oczywiście to robić rozumnie czyli na przykład jeżeli jakaś funkcja zwróci false wywoływany jest taki, a taki wyjątek poprzez throw ;
- blok catch przekazywany ma nasz typ obiektu wywołanego przez throw, czyli Esception. No i jak widać w bloku catch korzystamy z kilku funkcji - widać odwołania do nich w sposób znany Wam z programowania obiektowego, więc jak bardzo łatwo się domyślić, co też i widać korzystamy z metod klasy Exception.

No i tak nasza klasa Exception zawiera przydatne metody, jak :
- getCode() - zwraca kod przekazany do konstruktora (widać na przykładzie)
- getMessage() - zwraca komunikat przekazany do konstruktora (również widać)
- getFile() - zwraca ścieżkę do pliku (pełną - również widać)
- getLine() - numer linii/wiersza gdzie wystąpił błąd (widać :) )
- getTrace() - zwraca tablicę zawierającą zapis stosu wywołań do miejsca, w którym został zgłoszony wyjątek
- getTraceAsString - zwraca to co wyżej ale jako string (ciąg znaków)
- __toString() - wyświetla zawartość obiektu Exception zawierającego wszystkie dane zwracane przez poprzednie metody - czyli wywołujemy echo $e - zresztą znacie już działanie funkcji __toString .

Widzicie mam nadzieje, że jest to bardzo przydatne i potężne narzędzie. Oczywiście możemy pisać własne klasy do obsługi błędów/wyjątków, ale zdecydowanie dobrym podejściem jest pisanie na przykład klas potomnych do Exception - choćby dlatego, że mamy możliwość korzystania z wyżej wymienionych metod tej klasy, co tutaj jest bardzo przydatne.