Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: nie można ustawić własnego error handler'a
Forum PHP.pl > Forum > PHP
ivan_q
Natrafiłem na bardzo dziwny błąd ... otóż już nie raz pisałem własne error_handler'y ... ale przy obecnym projekcie coś się ostro sypie, i nie chce go w ogóle ustawić. Zawęziłem kod do samego wadliwego punktu, i nie dowierzam nadal czemu nie działa. Próbowałem już na 3 systemach operacyjnych (windows, gentoo oraz centos) ... nigdzie nie działa. Co jeszcze ciekawsze - przekopiowałem działające error_handler'y z innego projektu (który mi działa oczywiście w pełni) i to już zadziałać nie chciało. A to oznacza ze na serwerze na którym uruchamiam ten skrypt można ustawiać własne error_handler'y (czyli prawdopodobnie nie mam błędu w konfiguracji, skoro w innym, równoległym projekcie, na tym samym serwerze, na tej samej konfiguracji - działa).

Oto kod :
  1. <?php
  2.  
  3. function catcherror( $errtype, $errdesc, $errfile, $errline ) {
  4.  
  5. echo "<pre style='border:solid 1px red'>";
  6. echo "$errtype, $errdesc, $errfile, $errline\n";
  7. debug_print_backtrace();
  8. echo "</pre>";
  9. die();
  10. }
  11.  
  12.  
  13. if( set_error_handler( "catcherror" ) === NULL ) {
  14. echo "Cant set error handler !<br/>\n";
  15.  
  16. }
  17.  
  18. class tmp{};
  19.  
  20. $foo = new tmp();
  21. $foo->daa();
  22.  
  23. ?>


U mnie wydruk wygląda następująco :
Kod
   Cant set error handler !
    
     Fatal error:  Call to undefined method tmp::daa() in /var/www/localhost/htdocs/foo.php on line 21


Czemu to jest źle ? ponieważ powinien rzucić backtracem, a na dodatek komunikat błedu powinien podać w czerwonej ramce. Tymczasem się tak nie dzieje - komunikat który się pokazuje jest standardowym php'owym raportem o błędzie

Będę bardzo wdzięczny za pomoc, siedzię już nad tym prawie tydzień, w googlach też nie można znaleźć niczego konkretnego ...

Pozdrawiam
Kowalikus
1. Własnym error handlerem nie obsłużysz fatal error.
2. set_error_handler( "funkcja" ) zwraca poprzednio zdefiniowaną funkcje
sens miałby ten zapis
  1. <?php
  2. set_error_handler("catcherror");
  3. if( set_error_handler( "catcherror" ) === NULL ) 
  4. {
  5. echo "Cant set error handler !<br/>\n";
  6.  
  7. }
  8. ?>


W takim przypadku jak Ty podałeś możesz użyć instrukcji Try Catch do przechwycania wyjątków oraz napisać klasę wyjątku.
dr_bonzo
1. Poprzednio nie miales zadnego handlera ustawionego, wiec ci zwraca NULL (choc niejasno jest to w manualu napisane)
2. Takich fatalow handler nie zlapie.
ivan_q
ciekawe ... mogę powiedzieć że w takim razie jest to wybitnie niejasno napisane :
Kod
      Returns a string containing the previously defined     error handler (if any), or <b><tt>NULL</tt></b> on error


Tymczasem wracając : Kowalikus .... mówisz że do takiego przypadku można napisać exceptiona ? bardzo chętnie bym się dowiedział jak coś takiego zrobić, gdyż intensywnie zaczynam używać exceptionów, i to był właśnie pewien 'sęk' którego za bardzo nie wiedziałem jak obejść. Czy chodzi o to żeby w error_handlerze rzucić wyjątek ? Czy moze jakieś inne rozwiązanie ?
Kowalikus
  1. <?php
  2. class tmp
  3. {
  4. //magiczna funkcja __call () wywoływana wtedy gdy metoda nie istnieje
  5. public function __call($name, $arg)
  6. {
  7. throw new Exception('Klasa nie zawiera metody ' . $name);
  8. }
  9.  
  10. };
  11.  
  12. $foo = new tmp();
  13.  
  14. try
  15. {
  16. $foo->gg();
  17. }
  18. catch(Exception $e)
  19. {
  20. echo 'Przechwycony wyjątek: ', $e->getMessage(), "\n";
  21. }
  22. ?>


Pamiętaj, że Fatal Error jest bugiem w kodzie, po którym to skrypt jest zatrzymywany. Nie ma możliwości przechwycenia. Powyższy kod umożliwia obsłużenie błędu gdy próbujemy wykonać metodę na rzecz klasy która nie istnieje, ale da się to dzięki metodzie __call(). Poczytaj o Exception. Klasy wyjątków mogą dziedziczyć po wbudowanej klasie Exception, przez co możesz sobie modyfikować pewne elementy.
ivan_q
O Exceptions mam już dobrze przerobione, dziedziczenie po Exception mam już przewałkowane w wielu miejscach itp itd.

Co do przykładu ... cóż ... akurat wywołanie nieistniejącej metody było zamierzone, ponieważ chciałem wywołać tego typu błąd (jakiś poważniejszy exception)

Czyli generalnie nie ma żadnej możliwości żeby przygotować się na przetwarzanie 'niebezpiecznych plików' ? chodzi mi o sytuację gdzie z pliku głównego includuję coś, i jeśli w tym zaincludowanym pliku były błedy, to cały output z niego jest zatrzymany (ob_start itepe), a zamiast tego jest ładny komunikat błędu pokazywany. Czy mogę jakimiś handlerami mogę coś takiego osiągnąć ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.