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