PHP kézikönyv
Előző |  | Következő

# 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

string set_error_handler ( string 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); ?>`

Amikor futtatod a fenti példát, a következő kimetetet kapod:

    '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ő
restore_exception_handler | Fel | set_exception_handler