Előző leckénkben megismerkedhettünk a PHP-hibakezelés alapjaival, ma pedig megtanuljuk, hogyan kell saját hibakezelő funkciót létrehozni.
Saját hibakezelő létrehozása
A PHP arra is lehetőséget nyújt, hogy a programozó saját funkciót hozzon létre, mely kezeli a PHP-motor által generált futásidejű hibákat. A saját hibakezelő nagyobb rugalmasságot tesz lehetővé, és jobban kontrollálja a hibákat — kivizsgálja őket, majd eldönti, mit kell tenni velük: üzenetet jelenít meg a felhasználó számára, naplózza a hibát egy fájlban vagy adatbázisban, kiküldi e-mailben, megpróbálja javítani a problémát, megszakítja a script futtatását, vagy egyszerűen ignorálja a hibát.
A saját hibakezelő funkciónak legalább két paramétert (errno és errstr) támogatnia kell, opcionálisan azonban még három paraméter (errfile, errline és errcontext) használható.
Nélkülözhetetlen paraméterek:
errno — Meghatározza a hiba szintjét, egész szám formájában. Ez a paraméter a megfelelő hibaszintállandónak felel meg (E_ERROR, E_WARNING stb.) — ezekről előző leckénkben olvashattál.
errstr — Meghatározza a hibaüzenetet, string formájában.
Opcionális paraméterek:
errfile — Meghatározza a script fájl nevét, melyben a hiba megjelent, string formájában.
errline — Meghatározza a sor számát, melyben a hiba megjelent, string formájában.
errcontext — Meghatározza a tömböt, mely tartalmazza azokat változókat és értékeit, amelyek a hiba fellépésének pillanatában léteztek.
Most pedig következzen egy példa: a customError() hibakezelő minden olyan esetben aktiválódik, amikor hiba lép fel, legyen szó bármilyen triviális hibáról. A hibakezelő megjeleníti a hiba részleteit a böngészőben, majd megszakítja a script futtatását.
PHP-kód:
<?php
// Hibakezelő funkció
function customError($errno, $errstr) {
echo '<b>Error:</b> [' . $errno . '] ' . $errstr;
}
?>
Ahhoz, hogy utasítani tudjuk a PHP-t arra, hogy a saját hibakezelő funkciónkat használja, a beépített set_error_handler() funkciót tudjuk alkalmazni, melyben meghatározzuk a funkció nevét.
PHP-kód:
<?php
// Hibakezelő funkció
function customError($errno, $errstr) {
echo '<b>Error:</b> [' . $errno . '] ' . $errstr;
}
// Hibakezelő beállítása
set_error_handler('customError');
// Hiba beindítása
echo($test);
?>
A hibák naplózása
A hibákat naplózhatjuk szöveges fájlba, a következő módon:
PHP-kód:
<?php
function calcDivision($dividend, $divisor) {
if ($divisor == 0) {
trigger_error('calcDivision(): Az osztó nem lehet nulla', E_USER_WARNING);
return false;
}
else {
return ($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext) {
$message = date('Y-m-d H:i:s - ');
$message .= 'Hiba: [' . $errno . '], ' . $errstr . ' in ' . $errfile . ' on line ' . $errline . ', ';
$message .= 'Változók:' . print_r($errcontext, true) . "rn";
error_log($message, 3, 'logs/app_errors.log');
die('Probléma lépett fel, próbálja újra.');
}
set_error_handler('customError');
echo calcDivision(10, 0);
echo 'Ez soha nem lesz kinyomtatva.';
?>
A hiba részleteit e-mail formájában is kiküldhetjük, erre pedig szintén az error_log() funkciót használhatjuk.
PHP-kód:
<?php
function calcDivision($dividend, $divisor) {
if ($divisor == 0) {
trigger_error('calcDivision(): Az osztó nem lehet nulla', E_USER_WARNING);
return false;
}
else {
return ($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext) {
$message = date('Y-m-d H:i:s - ');
$message .= 'Hiba: [' . $errno . '], ' . $errstr . ' in ' . $errfile . ' on line ' . $errline . ', ';
$message .= 'Változók:' . print_r($errcontext, true) . "rn";
error_log($message, 1, 'webmaster@example.com');
die('Probléma lépett fel, próbálja újra. A hiba jelentve lett a webmesternek.');
}
set_error_handler('customError');
echo calcDivision(10, 0);
echo 'Ez soha nem lesz kinyomtatva.';
?>
Hiba kiváltása:
A PHP-motor minden alkalommal hibát vált ki, amikor problémába ütközik a script futtatása során, de magunk is tudunk hibát kiváltani. Ennek köszönhetően az alkalmazásunk erősebb lesz, hiszen megjelölheti az esetleges gondokat, még mielőtt azok súlyos hibákká válnának.
A hiba kiváltására a trigger_error() funkciót használhatjuk, melybe beiktatjuk a generálni kívánt hibaüzenetet:
trigger_error('Hiba lépett fel.');
Figyeljük meg a következő funkciót, melynek feladata, hogy elvégezze az osztás műveletét két számmal.
PHP-kód:
<?php
function calcDivision($dividend, $divisor) {
return ($dividend / $divisor);
}
// Funkció lehívása
echo calcDivision(10, 0);
?>
Ha a 0 érték a $divisor (osztó), a PHP-motor által generált hiba így fog megjelenni:
Warning: Division by zero in C:wampwwwprojecttest.php on line 3
Ha ennél jobb, több információt tartalmazó hibaüzenetet szeretnénk, a trigger_error() funkciót hívhatjuk segítségül:
<?php
function calcDivision($dividend, $divisor) {
if ($divisor == 0) {
trigger_error('Az osztó nem lehet nulla', E_USER_WARNING);
return false;
}
else {
return ($dividend / $divisor);
}
}
// Funkció lehívása
echo calcDivision(10, 0);
?>
Megjelenített hibaüzenet:
Warning: Az osztó nem lehet nulla in C:wampwwwprojecterror.php on line 4
Jó gyakorlást!
Nyereményjáték
Rovatunk elsődleges célja, hogy közelebbről is bemutassa a legismertebb webtechnológiákat. Azok között az olvasók között, akik minden héten követik rovatunkat, azaz velünk tanulják a programozás alapjait és kitöltik a feladatsort, a sorozat végén egy laptopot sorsolunk ki.
A játék heti kérdése:
Melyik funkciót kell használnunk, ha utasítani szeretnénk a PHP-t arra, hogy a saját hibakezelő funkciónkat használja?
A választ a tanulok@erdsoft.com e-mail-címre kell elküldeni, a tárgysorba pedig a következőt kell beírni: HÉTNAP-TANULOK. Sok szerencsét!
Néhány szó rólunk:
Az ErdSoft (www.erdsoft.com) 2011-ben alakult meg. Csapatunkat a fiatalos lendület, a szakértelem, a folyamatos tanulás és tapasztalatgyűjtés jellemzi. Ügyfeleinknek igyekszünk teljes körű szolgáltatást nyújtani — bátran fordulhatnak hozzánk, legyen szó webfejlesztésről, alkalmazásokról, SEO-optimalizálásról, grafikai tervezésről, marketingről vagy szövegírásról. Csapatunk sikerét mi sem bizonyítja jobban, mint a több száz elkészült weboldal és a számos elégedett ügyfél Szerbiában, Magyarországon és az Egyesült Királyságban.