Napisany sty-05-2009
obsługa błędów w PHP cz.2
Przyszedł czas pogłębić wiedzę na temat obsługi błędów w PHP. Tym razem spróbujemy przejąć nad nimi całkowitą kontrolę. Pomocna nam będzie funkcja set_error_handler(). Zatem do dzieła.
własny mechanizm obsługi błędów
Niestety nie wszystkie rodzaje error’ów możemy obsłużyć samodzielnie. Poniżej lista tych, których się nie da:
- E_CORE_ERROR
- E_CORE_WARNING
- E_COMPILE_ERROR
- E_COMPILE_WARNING
- E_PARSE
- E_ERROR
Set_error_handler() przyjmuje dwa parametry. Drugi w postaci maski bitowej przekazuje informacje o rodzajach obsługiwanych błędów przez funkcję, której nazwę rejestrujemy poprzez pierwszy parametr - chyba, że jest to metoda klasy; wówczas korzystamy z zapisu array(’klasa’,'metoda’). Spójrzmy jak to będzie wyglądać:
// funkcja moja_obsluga zajmuje sie bledami
// E_USER_ERROR, E_USER_WARNING i E_USER_NOTICE
set_error_handler('moja_obsluga',E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE);
Omówmy co powinna, a co może posiadać w parametrach funkcja moja_obsluga(). Rzut oka na prototyp:
function moja_obsluga ($error_type,$error_message,$error_file,$error_line,$error_context);
Pierwsze dwa są obowiązkowe.Znaczenie poszczególnych:
- $error_type - rodzaj błędu
- $error_message - komunikat
- $error_file - nazwa pliku w którym wystąpił error
- $error_line - linia w której nastąpił błąd
- $error_context - tablica wszystkich zmiennych w kontekście error’u
Zobaczmy jak to będzie wyglądać w praktyce:
function moja_obsluga ($error_type,$error_message,$error_file,$error_line) {
switch ($error_type) {
case E_USER_ERROR: echo 'Blad E_USER_ERROR '.$error_message.' , w pliku '.$error_file.' w linii '.$error_line;
break;
case E_USER_WARNING: echo 'Blad E_USER_WARNING '.$error_message.' , w pliku '.$error_file.' w linii '.$error_line;
break;
case E_USER_NOTICE: echo 'Blad E_USER_NOTICE '.$error_message.' , w pliku '.$error_file.' w linii '.$error_line;
}
}
set_error_handler ('moja_obsluga',E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE);
trigger_error('komunikat',E_USER_ERROR);
echo 'dzialam';
Zwróćmy uwagę na fakt, że wystąpienie E_USER_ERROR nie zakończy wykonywania skryptu - inaczej, niż ma to miejscu w przypadku standardowej procedury. Na koniec jeszcze jedna funkcja - restore_error_handler(), której wywołanie wygląda tak:
//przywracamy standardowa obsluge bledow restore_error_handler();
Osoby zainteresowane zachęcam do zapoznania się z tematyką wyjątków.
