Autor Zpráva
lorin
Profil
Dobrý večer,
chci si pro své potřeby napsat třídu, která by zachycovala chyby v kódu (výjimky, parse errory, a zbytek chyb).

class ErrorHandler {
        
        private static $error_types = array(
        
            E_ERROR => "ERROR",
            E_WARNING => "WARNING",
            E_PARSE => "PARSE ERROR",
            E_NOTICE => "NOTICE ERROR", 
            E_CORE_ERROR => "CORE_ERROR", 
            E_CORE_WARNING => "CORE_WARNING",
            E_CORE_ERROR => "COMPILE_ERROR",
            E_CORE_WARNING => "COMPILE_WARNING",
            E_USER_ERROR => "E_USER_ERROR",
            E_USER_WARNING => "USER_WARNING",
            E_USER_NOTICE => "USER_NOTICE", 
            E_STRICT => "STRICT",
            E_RECOVERABLE_ERROR => "RECOVERABLE_ERROR",
            E_DEPRECATED => "DEPRECATED",
            E_USER_DEPRECATED => "USER_DEPRECATED", 
        
        );
        
        private static $enabled;
        
        public static function getErrorTypeAsString( $error_code ) {
            if (isset( self::$error_types[$error_code] )) {
                return self::$error_types[$error_code];
            } else {
                return "Undefined error";
            }
        }

        public static function enable() {
            
            //error_reporting(0);
            
            if ( self::$enabled == false ) {
                
                register_shutdown_function(array(__CLASS__, '_shutdownHandler'));
                set_exception_handler(array(__CLASS__, '_exceptionHandler'));
                set_error_handler(array(__CLASS__, '_errorHandler'));
            
            }
            
            self::$enabled = true;
        }
        
        public static function disable() {
            
            self::$enabled = false;
            
        }
        
        public static function _shutdownHandler() {
            
            if (self::$enabled == false) {
                return;
            }
            
            $error = error_get_last();
            
            if ( !empty( $error ) ) {
                
               self::_exceptionHandler( new ErrorException( $error["message"], $error["type"], 0, $error["file"], $error["line"], NULL) );
                
            }
            
            return;
        }
        
        public static function _exceptionHandler(Exception $e) {
            
            // Zde dostávám špatná data            
            
        }
        
        public static function _errorHandler($number, $message, $file, $line, $context) {
            
            throw new ErrorException($message, $number, $number, $file, $line);
            
        }
    }

Problém je, že v případě vyvolání parse erroru (a následné zavolání __shutdownHandler) jsem sice z $e->getLine() a $e->getFile() schopen dostat správný řádek a soubor, ve kterém chyba nastala. Bohužel v trace je jako třída uveden ErrorHandler a jako funkce __shutdownHandler..

Jde nějak získat třídu (pokud nějaká je) a funkci (pokud nějaká je), ve které byl parse error vyvolán?

Děkuji.
Tori
Profil
Mohla by pomoct debug_backtrace.
lorin
Profil
Tu funkci jsem zkoušel použít, ve výsledku vypíše vlastně hodně podobné informace jako error_get_last() použitý pro naplnění výjimky v metodě _shutdownHandler. Třída i funkce je uvedena stejně.
Jan Tvrdík
Profil
lorin:
Jde nějak získat třídu (pokud nějaká je) a funkci (pokud nějaká je), ve které byl parse error vyvolán?
Ano, ale potřebuješ k tomu zapnutý Xdebug, viz např. implementace v Nette.
lorin
Profil
Předpokládám že nejde o standardní rozšíření, které by bylo k dispozici na většině serverů, že? Pokud ne, je to pro mé potřeby relativně nevyužitelné. Přesto děkuji za informaci.

V případě parse error(u) budu vypisovat jen soubor a řádek. Myslím že to bude plně postačovat.
Jan Tvrdík
Profil
lorin:
Předpokládám že nejde o standardní rozšíření, které by bylo k dispozici na většině serverů, že?
Vzhledem k tomu, jak výrazně Xdebug zpomaluje PHP, tak ho na žádném rozumně nastaveném serveru nenajdeš. Naopak na „localhostu“ je k dispozici poměrně běžně.

Proč vlastně píšeš „něco jako Tracy (resp. laděnka)“ a nepoužiješ ji rovnou?

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: