Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przechwytywanie błędów Fatal error
Forum PHP.pl > Forum > PHP
lucassus
Witam,

Kod
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 4864 bytes) in ...


Czy jest jakiś sposób przechwycenie błędów tego typu i wyświetlenie użytkownikowi ładnego komunikatu?
nospor
Fatal errorow nie jestes w stanie przechwycic. Taki bład konczy dzialanie aplikacji
qbs
teoretycznie mozesz uzyc czegos takiego:

  1. <?php
  2.  
  3.  
  4. class my_fatal_errors
  5. {
  6.    
  7.    public function __construct( )
  8.    {
  9.        
  10.        ob_start();
  11.    }
  12.    
  13.    public function __destruct( )
  14.    {
  15.        
  16.        if( strpos(ob_get_contents(),'Fatal error') !== false )
  17.        {
  18.            
  19.            ob_clean();
  20.            
  21.            exit( "Cos dalo ciala..." );
  22.        }
  23.    }
  24. }
  25.  
  26. $useless            = new my_fatal_errors;
  27.  
  28. sdfdfasdfa();
  29.  
  30. print "ok";
  31.  
  32. ?>


aczkolwiek moze byc dosc klopotliwe. inne errory obsluzysz poprzez set_error_handler
szagi3891
Jest możliwe przechwycenie tego błędu oraz da się określić w którym miejscu wystąpił. Osobiście używam klasy specjalnej która wychwytuje mi błędy / nieobsłużone wątki / oraz błędy fatall error. Po niżesz szklic tej klasy:

  1. <?php
  2. class error
  3. {
  4.  
  5. public function __construct()
  6.    {
  7.    set_error_handler(array($this, 'LoginError'));  //przechwytywanie błędów
  8.    set_exception_handler(array($this, 'LoginException'));  //przechwytywanie nieobsłużonych wyjątków
  9.    ob_start(array($this, 'ob_start')); //przechwytywanie fatalności
  10.    }
  11.  
  12. public function LoginException($wyjatek)  {
  13.   //z tym wyjątkiem można zrobić co się chce, zapisać, wyświetlić ,
  14.    }
  15.  
  16. public function LoginError($number, $message, $file, $line) {
  17.       //przechwycone błędy
  18.     }
  19.  
  20. public function ob_start($buffer)
  21.    {
  22.    if (preg_match("#(error</b>:)(.+?)(<br)#si", $buffer, $regs))
  23.        {
  24.        $komunikat = '--przechwycono błąd parsowania--';
  25.        if (isset($regs[2])) {
  26.            $komunikat = $regs[2];
  27.            $komunikat = preg_replace('#<[^<>]*>#si', '', $komunikat);
  28.            }
  29.        }
  30.    
  31.       //$komunikat -- ta zmienna zawiera treść komunikatu
  32.  
  33.    return $buffer;
  34.    }
  35. }
  36. ?>


na początku skryptu dołączam :
$errory = new error();
i mam pewność co do przechwyconych błędów łącznie z błędami fatall.
Oczywiście w tych procedurach zawarłem funkcje logujące do pliku błędy które wystąpiły. Bardzo fajna funkcją jest funkcja debug_backtrace() która zwraca tablicę kolejnych wywołań. Podstawowa informacja o błędzie plus wynik funkcji debug_backtrace() pozwala na skuteczne zlokalizowanie i usunięcie błędu.
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.