Autor Zpráva
Noname
Profil *
Ahoj, snažím se udělat jednoduchý debugovací nástroj pro můj web. Chci zabránit aby v případě nějaké chyby (třeba fatal erroru) se uživateli zobrazila naprosto nesrozumitelná hláška. Proto bych rád aby se uživateli vykreslila stránka kde bude napsáno, že stránka je dočasně nefunkční. Proto jsem si na to udělal takovou "třídu", která se mi o to postará. Problém je v tom, že když chci odchytit především fatal error tak se mi to "odchytí", ale stejně mám nad tím ten error vypsaný (např Call to a member function bull() on a non-object ). Dá se vve funkci vypsání toho erroru zabránit aby se nezobrazil uživateli, ale zůstal zachycený v mé funkci? Možná jsem to nějak nejlíp nevysvětlil tak ještě přiložím příklad.

register_shutdown_function('shutdownHandler');

public static function shutDownHandler()
    {
        echo "Shut down! <br />";
        $callback = func_get_args();
        Debugger::dump($callback);
    }

$name = null;
$name->get();

Fungovalo mi to pouze v případě, že jsem to rovnou přesměroval na nějakou stránku. Je to sice řešení, ale raději se poradím s váma jak se to dá "nejlépe" řešit. Díky za poznámky a rady!


Nemá to být public static function, ale pouze function, bral jsem to z té mé "třídy"
Tori
Profil
Noname:
Dá se vve funkci vypsání toho erroru zabránit aby se nezobrazil uživateli, ale zůstal zachycený v mé funkci?
set_error_handler, set_exception_handler - zobrazení chybové hlášky ovlivňuje návratová hodnota callbacku.
Noname
Profil *
Obojí mám "odchycené" ale prostě ono mi to "funguje", ale ten fatal error se mi prostě zobrazí. Jak říkám, zatím jsem přišel na jediné řešení s přesměrováním.
Noname
Profil *
Možná to špatně vysvětluji a za to se omlouvám. Prostě je problém v tom, že tu chybu si odchytím, vypíšu (nebo sní prostě pracuju), ale u fatal erroru mi to tu chybovou hlášku zobrazí a tomu bych chtěl zabránit.
Tori
Profil
Noname:
Můžete ukázat tu funkci/metodu, kterou máte registrovanou jako error handler?
koudi
Profil
Jestli nechceš, aby chybu viděl uživatel, tak vypni výpis chyb v php.ini nebo pres error_reporting().
Noname
Profil *
register_shutdown_function(array(__CLASS__, 'shutdownHandler'));
set_exception_handler(array(__CLASS__, 'exceptionHandler'));
set_error_handler(array(__CLASS__, 'errorHandler'));


public static function errorHandler($severity, $message, $file, $line, $context)
    {
        if ($severity === E_RECOVERABLE_ERROR || $severity === E_USER_ERROR) {
        self::exceptionHandler(new ErrorException($message, 0, $severity, $file, $line, $context));
        }

        self::exceptionHandler(new ErrorException($message, 0, $severity, $file, $line));
    }

    public static function shutDownHandler()
    {
        $error = error_get_last();
        self::exceptionHandler(new ErrorException($error['message'], 0, $error['type'], $error['file'], $error['line'], NULL));
    }

    public static function exceptionHandler(Exception $exception)
    {                
        if(self::$mode === self::PRODUCTION){
            $message = 'Error: ' . $exception->getMessage() . ' in ' . $exception->getFile() . ' at line ' . $exception->getLine();
            self::$logger->log($message);
        }else{
            Debugger::dump('Error: ' . $exception->getMessage() . ' in ' . $exception->getFile() . ' at line ' . $exception->getLine() );
        }
    }
Tori
Profil
Noname:
It is important to remember that the standard PHP error handler is completely bypassed for the error types specified by error_types unless the callback function returns FALSE“ (praví manuál o set_error_handler)
Jelikož metoda errorHandler nic nevrací, tak bych tipla, že to nic se zaokrouhlí na FALSE. Hodně funkcí v PHP porovnává vstupní hodnoty přibližně, místo ===. (Jinak u sebe to mám tak, že na localhostu posílám všechny chyby do logu i na obrazovku - aspoň si jich hned všimnu, a na prod.serveru jdou jen do logu.)
Noname
Profil *
Přesně tak to chci udělat aby se všechny errory poslaly do logu (na prod. serveru). No dal jsem tam return true, ale pořád je to stejný, při fatal erroru (u jiného ne) se to vypíše.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: