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.