set_error_handler
(PHP 4 >= 4.0.1, PHP 5)
set_error_handler — felhasználói hibakezelő függvényt regisztrál
Leírás
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.
Note: A függvény neve helyett egy tömböt is átadhatsz, aminek egy objektum referenciát és egy metódus nevet kell tartalmaznia.
Note: 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:
Example#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.
Note: 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()!