PHP kézikönyv
Előző
Következő
A error_handler A error_handler paraméterben megadott felhasználó által létrehozott hibakezelő függvényt állítja be a szkriptben felbukkanó hibák kezelésére.
Visszatérési értéke a korábbi hibakazelő (ha volt ilyen), vagy FALSE hiba esetén.
Ez a függvény használható futásidőben saját hibakezelő függvény definiálására, ha például a saját ideiglenes adatállományaid hiba esetén törlésre szorulnak, vagy ha a trigger_error() függvényt testreszabott hibaüzenetek küldésére szeretnéd használni.
Megjegyzés:
A függvény neve helyett egy tömböt is átadhatsz, ami egy objektum referenciát és egy metódus nevet kell tartalmazzon.
Megjegyzés:
A következő hibafajták nem kezelhetők le saját, felhasználói hibakezelő-függvényekkel:
E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR és E_COMPILE_WARNING.
A függvényt, amit megadsz két paramétert kell, hogy fogadjon, a hibakódot és a hibaüzenet karaktersorozatát.
A PHP 4.0.2 verzió óta újabb három elhagyható paraméter is rendelkezésre áll: az állomány neve, ahol a hiba felbukkant, a sorszám, ahol a hiba megjelent, és az aktuális környezet (egy, a hiba létrejöttekor aktív szimbólum táblára mutató tömb).
A következő példa bemutatja, hogy hoyagn kell kezelni a belső kivételeket a felhasználói hibák keltésével, és egy felhasználó által definiált függvénnyel:
Példa 1.
Hibakezelés a set_error_handler() és trigger_error() függvényekkel
?php / / Rövidebb nevek a felhasználói hibákhoz - csak PHP 4-ben define ('FATAL', E_USER_ERROR); define ('ERROR', E_USER_WARNING); define ('WARNING', E_USER_NOTICE); / / A hibajelentési szint beállítása error_reporting (FATAL | ERROR | WARNING); / / Hibakezelő függvény létrehozása function hibaKezelo ($hszam, $hszoveg, $hfile, $hsor) {switch ($hszam) {case FATAL: echo "b FATÁLIS HIBA / b [$errno] $errstr br \n"; echo" Fatális hiba a ".$errline .". sorban a ".$errfile; echo "állományban, PHP ".PHP_VERSION." (".PHP_OS .") br \n"; echo "Kilépés... br \n"; exit(1); break; case ERROR: echo "b HIBA / b [$errno] $errstr br \n"; break; case WARNING: echo" b FIGYELMEZTETÉS / b [$errno] $errstr br \n"; break; default: echo "Ismeretlen hibatípus: [$errno] $errstr br \n"; break;}} / / Függvény, ami teszteli a hibakezelést function log_szorzas ($vektor, $mertek) {if (!is_numeric($mertek) | | $mertek = 0) trigger_error("log(x) x = 0 esetén nem definiált (a megadott $mertek érték hibás)", FATAL); if (!is_array($vektor)) {trigger_error("Hibás vektor, értékek tömbjét kell megadni", ERROR); return null;} for ($i=0; $i count($vektor); $i++) {if (!is_numeric($vektor[$i])) trigger_error("A vektor $i. eleme nem szám, nullával számolok", WARNING); $ideiglenes[$i] = log($mertek) * $vektor[$i];} return $ideiglenes;} / / A felhasználói hibakezelő beállítása $regi_hiba_kezelo = set_error_handler("hibaKezelo"); / / Tömb nem szám értékkel echo "'a 'vektor\n"; $a = array(2,3 ,"izé",5.5,43.3,21.11); print_r($a); / / Figyelmeztetés generálása, új tömb létrehozása echo "----\n'b' vektor - figyelmeztetés (b = log(PI) * a)\n"; $b = log_szorzas($a, M_PI); print_r($b); / / Ebből gond lesz, karaktersorozatot adunk át tömb helyett echo "----\n'c 'vektor - hiba\n"; $c = log_szorzas("ez nem tömb", 2.3); var_dump($c); / / Ez kritikus hiba lesz, negatív szám logaritmusa nem értelmezett echo "----\n'd' vektor - fatális hiba\n"; $d = log_szorzas($a, -2.5);?
'a' vektor Array ([0] = 2 [1] = 3 [2] = izé [3] = 5.5 [4] = 43.3 [5] = 21.11) --- - 'b 'vektor - figyelmeztetés (b = log(PI) * a) b FIGYELMEZTETÉS / b [1024] A vektor 2. eleme nem szám, nullával számolok br Array ([0] = 2.2894597716988 [1] = 3.4341896575482 [2] = 0 [3] = 6.2960143721717 [4] = 49.566804057279 [5] = 24.165247890281) --- - 'c' vektor - hiba b HIBA / b [512] Hibás vektor, értékek tömbjét kell megadni br NULL --- - 'd 'vektor - fatális hiba b FATÁLIS HIBA / b [256] log(x) x = 0 esetén nem definiált (a megadott -2.5 érték hibás) br Fatális hiba a 36. sorban a trigger_error.php állományban, PHP 4.0.2 (Linux) br Kilépés... br
Fontos megjegyezni, hogy a PHP belső hibakezelője teljesen figyelmen kívül marad.
Az error_reporting() beállítások nem befolyásolják a felhasználói hibakezelő meghívását, minden hiba esetén lefut a hibakezelő az aktuális szinttől függetlenül.
Ha ezt el szeretnéd kerülni, a hibakezelőben olvasd be az aktuális szintet (error_reporting), és írd meg úgy a függvényt, hogy annak megfelelően viselkedjen.
Szintén fontos megjegyezni, hogy ez az érték 0 lesz, ha azt a parancsot, ami éppen meghívásra került a @ hibakezelő oprátorral adták meg.
Arról sem szabad elfeledkezni, hogy a programozó felelőssége a szkript futás megszakítása, ha ez szükséges (például a exit() meghívásával).
Ha a hibakezelő függvény visszatér, a szkript futása is folytatódni fog a következő paranccsal.
Megjegyzés:
Ha bármilyen hiba keletkezik, még mielőtt a szkript elindulna (e.g. fájl feltöltésekor) a felhasználói hibakezelő nem indul, hiszen abban a pillanatban még nincs is regisztrálva.
Lásd még: error_reporting(), restore_error_handler(), trigger_error() és user_error()!
Előző
Tartalom
Következő
Fel