Forum und email

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.

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($aM_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.

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()!