PHP, szczególnie od wersji 5 w górę jest całkiem przyjemnym językiem i swoimi możliwościami nie odstaje aż tak bardzo od C++, czy Java. Fakt, jest prostszy, ale odkąd działa w nim prawdziwa obiektówka i wyjątki, dobre programowanie stało się wygodniejsze.

Niestety, PHP nie jest pozbawione kilku niedociągnięć, czasami przeradzających się gigantyczny ból w tyłku. Jednym z nich jest niekonsekwencja zachowania funkcji na błędy. Część rzuca wyjątki, część rzuca błędy, a jeszcze inne zwracają FALSE lub NULL gdy coś nie idzie po ich myśli. Z tego powodu, sensowym wyjściem jest napisanie własnej funkcji obsługi błędów przekształcających je na wyjątki. A skoro można napisać coś takiego, to czemu od razu nie napisać własnej funkcji obsługi wyjątków i dodać kilka innych usprawnień?

Z tych powodów, bazując na klasie wfErrorHandler Grzegorza Godlewskiego, napisałem własną klasę obsługi błędów: psDebug. Jej główne cechy to:

  • wszystkie błędy są przekształcane na wyjątki w celu ich późniejszego przechwycenia
  • wyjątki które nie zostały przechwycone mogą być raportowane na następujące sposoby:
    • elegancki komunikat dla użytkownika nie zawierający szczegółów
    • pełny komunikat o błędzie razem ze ścieżką wykonania
    • przesłanie w tle komunikatu o błędzie do phHelpdesk (który kiedyś wreszcie opublikuję jako OpenSource)
  • dodatkowe funkcje wspomagające obsługę błędów

Integracja psDebug z dowolnym programem PHP jest banalnie prosta: wystarczy dołączyć plik klasy do programu i zarejestrować funkcje przez psDebug:create();. Od tego momentu standardowe komunikaty błędów i wyjątków PHP zostają wyłączone i psDebug przejmuje nad nimi kontrolę.

psdebugJak pisałem, zgłoszenie błędu ma postać dwóch okien: ogólnego dla użytkownika i szczegółowego dla dewelopera. Pojawianiem się tych okien można sterować dwoma zmiennymi:

  • boolean psDebug::$displayErrors - steruje oknem ogólnym
  • boolean psDebug::$displayTrace - steruje oknem szczegółowym

Dodatkowo, psDebug posiada jeszcze następujące zmienne konfiguracyjne:

  • boolean psDebug::$sendTrace - czy zgłoszenie ma być przesłane na psHelpdesk, na życzenie udostępniam skrypt odbierający zgłoszenia, lecz na razie nie będę tego opisywał
  • array psDebug::$senderConfig - konfiguracja wysyłania zgłoszeń na psHelpdesk
  • boolean psDebug::$errorHoldsExecution - czy błędy mają być przekształcane na wyjątki. Gdy wyłączone, niedostępny jest trace błędów
  • string psDebug::$standardErrorText - domyślny tekst informujący użytkownika o błędzie
  • string psDebug::$additionalErrorText - tekst dodatkowy dołączany do komunikatu

Oto przykład konfiguracji dla celów deweloperskich, wyświetlający pełny komunikat błędu oraz całą ścieżkę wykonania:

psDebug::$displayErrors = true;
psDebug::$displayTrace = true;
psDebug::$standardErrorText = 'Nastąpił nieoczekiwany błąd programu!';
psDebug::$additionalErrorText = 'Jeśli chcesz pomóc, zgłoś ten błąd do serwisu';
psDebug::create ();

W przypadku systemu produkcyjnego warto jest ustawić psDebug::$displayTrace = false;. Zwolni to użytkowników z obowiązku oglądania pełnej ścieżki wykonania i opisu błędu na czerwonym tle.

W psDebug wbudowałem też funkcje dodatkowe, wspomagające obsługę błędów:

  • psDebug::cThrow($message = null, Exception $exception = null, $config = null) - funkcja pomocna przy przechwytywaniu błędów w bloku try catch. Przykład użycia:

try {
....
} catch ( Exception $e ) {
return psDebug::cThrow ( 'Mój komunikat o przechwyceniu wyjątku', $e, array ('display' => true ) );
}

  • psDebug::halt($message = null, Exception $exception = null, $config = null) - zatrzymanie programu z komunikatem o błędzie identycznym jak psDebug::cThrow
  • psDebug::print_r($value) - print_r w ładniejszej postaci

psDebug jest dostępny na licencji MIT i można go pobrać tutaj. Czekam na sugestie związane z pracą i ewentualną rozbudową.