Autor | Zpráva | ||
---|---|---|---|
lorin Profil |
#1 · Zasláno: 5. 12. 2013, 17:43:20
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 |
#2 · Zasláno: 5. 12. 2013, 18:03:16
Mohla by pomoct debug_backtrace.
|
||
lorin Profil |
#3 · Zasláno: 5. 12. 2013, 18:10:25
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 |
#4 · Zasláno: 7. 12. 2013, 11:51:50
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 |
#6 · Zasláno: 7. 12. 2013, 20:07:05
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? |
||
Časová prodleva: 10 let
|
0