set_error_handler

(PHP 4 >= 4.0.1)

set_error_handler --  Beállít egy felhasználói hibakezelő függvényt

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.

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 elfeledkezned, hogy a Te felelősséged 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.

Lásd még: error_reporting(), restore_error_handler(), trigger_error() és user_error()!