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.

Tagi : , ,

Napisz komentarz