Jelenlegi hely

3.9.2. Alapértelmezett hibakezelő függvény készítése

A hibakezeléssel kapcsolatban az egyik legnagyobb veszély, hogy elfeledkezünk egyes hibalehetőségek lekezeléséről. Ezért praktikus, ha minden lehetséges hibát egységesen kezelünk le. Az alapötlet az, hogy megkérjük a futtatókörnyezetet: minden hiba esetén hívja meg ugyanazt a függvényt. Ezt a hibakezelő függvényt tehát nem a mi kódunk fogja közvetlenül meghívni. Az ilyen függvényt callback függvénynek szokás hívni.

Egy alapértelmezett hibakezelő függvény készítése meglehetősen egyszerű. Egyszerűen egy speciális függvényt kell létrehozni, ami meghívható, ha hiba merül fel futás közben.

Ennek a függvénynek tudnia kell kezelni legalább két paramétert (hiba szintje és hibaüzenet), de elfogadhat maximum öt paramétert. (Az opcionálisak: fájl, a sor száma és a hibakörnyezete.) Szintaxis:

error_function (error_level,error_message, error_file, error_line, error_context)

A paraméterek jelentése:

  • error_level: Kötelező. Megadja, hogy milyen hibákat akarunk lekezelni. Egy számértéknek kell lennie a 12. táblázatnak megfelelően.
  • error_message: Kötelező. A hibaüzenetet tartalmazza.
  • error_file: Opcionális. A fájlnevet tartalmazza, ahol a hiba felmerült.
  • error_line: Opcionális. A sor számát tartalmazza, ahol a hiba felmerült.
  • error_context: Opcionális. Egy tömböt tartalmaz, amiben benne van minden változó és annak értéke, melyek használatban voltak, amikor a hiba felmerült.

Hiba értesítési szintek

Ezek a hiba értesítési szintek azok a hibafajták, melyek orvoslására a felhasználó által létrehozott hibakezelőket használni lehet:

  • 2 - E_WARNING: Nem végzetes futásidejű hibák. A szkript végrehajtása nem lesz megszakítva.
  • 8 - E_NOTICE: Futásidejű figyelmeztetés. A szkript talált valamit, ami lehetséges hibaforrás, de az értesítés akkor is előfordulhat, ha a szkript hibamentesen fut.
  • 256 - E_USER_ERROR: Végzetes felhasználó által generált hiba. Ez olyan, mint egy E_ERROR, melyet a programozó állít be a trigger_error függvényt használva.
  • 512 - E_USER_WARNING: Nem végzetes felhasználó által generált figyelmeztetés. Ez olyan, mint egy E_WARNING, melyet a programozó állít be a trigger_error függvényt használva.
  • 1024 - E_USER_NOTICE: Felhasználó által generált értesítés. Ez olyan, mint egy E_NOTICE, melyet a programozó állít be a trigger_error függvényt használva.
  • 4096 - E_RECOVERABLE_ERROR: Elkapható végzetes hiba. Ez olyan, mint egy E_ERROR, de ez elkapható egy felhasználó által definiált hibakezelővel.
  • 8191 - E_ALL: Minden hiba és figyelmeztetés, kivéve a E_STRICT szintet.

Hozzunk létre egy függvényt a hibák kezelésére:

<?php
function customError($errno, $errstr) {
  echo
"<b>Error:</b> [$errno] $errstr<br>";
  echo
"Ending Script";
  die();
}
?>

A fenti kódrészlet egy egyszerű hibakezelő függvény. Amikor megkapja a vezérlést, megkapja a hiba szintjét és egy hiba üzenetet. Ezután a kimenetre küldi a hibaszintet és üzenetet, és a szkript futása befejeződik. Természetesen ez csak egy vázlatos megoldás. Ilyen esetben célszerű lehet egy log fájlba írni a hibakezeléshez szükséges információkat.

Most tehát, miután írtunk egy hibakezelő függvényt, el kell döntenünk, milyen esetekben legyen meghívva.

A hibakezelő beállítása

Az alapértelmezett hibakezelő a PHP-ban egy beépített függvény. Most azonban a beépített megoldás helyett a fenti függvényt fogjuk használni.

Lehetséges úgy megváltoztatni a hibakezelőt, hogy csak bizonyos hibákra vonatkozzon, és a szkript különböző hibákat különbözőképpen tudjon kezelni. Mi most ebben a példában a saját hibakezelőt fogjuk használni az összes hiba esetén:

<?php
set_error_handler
("customError");
?>

Mivel azt akarjuk, hogy a hibakezelő függvényünk minden hibát kezeljen, a set_error_handler csak egy paramétert kívánt, a második csak opcionális, és a hiba szintjét határozza meg.

Teszteljük a hibakezelőt, olyan változót megpróbálva kiíratni, ami nem létezik:

<?php
function customError($errno, $errstr) {
  echo
"<b>Error:</b> [$errno] $errstr";
}
set_error_handler("customError");
echo(
$test);
?>

A kód kimenete ehhez hasonló lesz:

Error: [8] Undefined variable: test

Hiba előidézése

Egy szkriptben, melyben a felhasználók adatokat vihetnek be, hasznos lehet a hibák előidézése, amikor egy nem megfelelő bevitel adódik. A PHP-ban ezt a trigger_error-ral lehetséges.

Ebben a példában hiba történik, ha a test változó nagyobb, mint 1:

<?php
$test
=2;
if (
$test>1) {
 
trigger_error("Value must be 1 or below");
}
?>

A kód kimenete ehhez hasonló lesz:

Notice: Value must be 1 or below in C:\webfolder\test.php on line 6

Egy hibát meg lehet hívni bárhol a szkripten belül, és egy második paraméter hozzáadásával meg lehet határozni, hogy milyen hiba szintet akarunk előidézni.

Ebben a példában egy E_USER_WARNING üzenet jelenik meg, ha a test változó nagyobb, mint 1. Egy ilyen esetben a szokásos hibakezelőnket használjuk, és befejezzük a szkript futtatását:

<?php
function customError($errno, $errstr) {
  echo
"<b>Error:</b> [$errno] $errstr<br>";
  echo
"Ending Script";
  die();
}
set_error_handler("customError",E_USER_WARNING);
$test=2;
if (
$test>1) {
 
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

A kód kimenete ehhez hasonló lesz:

Error: [512] Value must be 1 or below
Ending Script

Most, hogy megtanultunk saját hibakezelőt készíteni, és hogy hogyan lehet meghívni őket, vessünk egy pillantást a hiba naplózásra.

Hiba naplózása

A php.ini error_log konfigurációjában beállított módon lehetőség van a hiba naplózásának finomhangolására.

Hibaüzenetek a saját email címre küldése egy jó módszer arra, hogy értesüljünk a különböző hibákról.

Egy hiba üzenet elküldése e-mailben

Az alábbi példában egy e-mailt fogunk elküldeni egy hibaüzenettel, és leállítjuk a szkriptet, ha egy bizonyos hiba megjelenik:

<?php
function customError($errno, $errstr) {
  echo
"<b>Error:</b> [$errno] $errstr<br>";
  echo
"Webmaster has been notified";
 
error_log("Error: [$errno] $errstr",1,
 
"<a href="mailto:someone@example.com">someone@example.com</a>","From: <a href="mailto:webmaster@example.com">webmaster@example.com</a>");
}
set_error_handler("customError",E_USER_WARNING);
$test=2;
if (
$test>1) {
 
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

A kód kimenete ehhez hasonló lesz:

Error: [512] Value must be 1 or below
Webmaster has been notified

A levél, amit kapunk, ehhez hasonló lesz:

Error: [512] Value must be 1 or below

Ezt nem tanácsos használni minden hiba esetén. A rendszeres hibákat inkább a szerveren naplózzuk, a PHP alapértelmezett naplózási rendszerét használva.