
Mai leckénkben a PHP kivételkezelési lehetőségeiről lesz szó. Ahhoz azonban, hogy megtanuljuk kezelni őket, először is válaszolnunk kell a következő kérdésre:
Mi a kivétel?
A kivétel egy olyan jelzés, amely arra utal, hogy valamilyen kivételes esemény vagy hiba lépett fel. A kivételeket több dolog is okozhatja, például az adatbázissal való kapcsolat megszakadása, olyan fájlhoz megkísérelt hozzáférés, amely nem létezik, stb.
A PHP-nek egy nagyszerű mechanizmusa van a kivételek kezelésére. A PHP hagyományos hibakezelő rendszerével ellentétben a kivételkezelés egy objektumorientált hibakezelő módszer, mely lehetővé teszi a kontrolláltabb és rugalmasabb hibajelentést. A kivételek modellje először a PHP 5-ben lett bemutatva.
A throw és a try...catch állítások használata
A kivételeken alapuló megközelítés esetében a programkódot a try blokkba írjuk, a kivételt pedig a throw állítás segítségével „dobjuk”, abban az esetben, ha valamilyen kivételes eset lép fel a try blokkban levő kód kivitelezése során. Ezután a kódot egy vagy több catch blokk „kapja el” és oldja meg.
A következő példa illusztrálja a kivételkezelés működését.
PHP-kód:
<?php
function division($dividend, $divisor) {
// Kivétel dobása, ha az osztó nulla
if ($divisor == 0) {
throw new Exception('Nullával való osztás.');
}
else {
$quotient = $dividend / $divisor;
echo "<p>$dividend / $divisor = $quotient</p>";
}
}
try {
division(10, 2);
division(30, -4);
division(15, 0);
// Ha kivételt „dobunk”, a következő sor nem lesz végrehajtva
echo '<p>Minden osztás sikeresen el lett végezve.</p>';
} catch (Exception $e) {
// Kivételkezelés
echo '<p>Elkapott kivétel: ' . $e->getMessage() . '</p>';
}
// Végrehajtás folytatása
echo '<p>Helló Világ!</p>';
?>
Hogy jobban megértsd, mi történik a kódban, minden részt külön elmagyarázunk. A kivételkezelő rendszer alapjában négy részből áll: try, throw, catch és az Exception class.
- A division() funkció a fenti példában leellenőrzi, hogy az osztó értéke megegyezik-e nullával. Ha igen, kivételt dobunk a throw állítás segítségével. Ha az osztó nem nulla, a funkció elvégzi az osztást a számokkal, és megjeleníti az eredményt.
- Ezután a division() funkciót lehívjuk a try blokkon belül, különböző argumentumokkal. Ha kivétel jön létre a kód végrehajtása során a try blokkon belül, a PHP leállítja a végrehajtást azon a ponton, és megpróbálja megkeresni a megfelelő catch blokkot. Ha megvan, a catch blokkon belüli kód lesz végrehajtva, ha nincs meg, végzetes hiba (fatal error) lép fel.
- A catch blokk elkapja a try blokkon belül dobott kivételt, és létrehoz egy objektumot ($e), mely tartalmazza a kivétel információit. Az objektum hibaüzenete lehívható a kivétel getMessage() módszerével.
A PHP Exception osztálya más módszereket is nyújt a részletes debuggolási információk generálására, ezek a getCode(), getFile(), getLine() és a getTraceAsString() módszerek.
PHP-kód:
<?php
// Az alapértelmezett hibajelentés kikapcsolása
error_reporting(0);
try {
$file = 'somefile.txt';
// Megpróbáljuk megnyitni a fájlt
$handle = fopen($file, 'r');
if (!$handle) {
throw new Exception('A fájl nem megnyitható!', 5);
}
// Megpróbáljuk olvasni a fájl tartalmát
$content = fread($handle, filesize($file));
if (!$content) {
throw new Exception('A fájl nem olvasható!', 10);
}
// A handle bezárása
fclose($handle);
// A fájl tartalmának megjelenítése
echo $content;
} catch (Exception $e) {
echo '<h3>Elkapot kivétel!</h3>';
echo '<p>Hibaüzenet: ' . $e->getMessage() . '</p>';
echo '<p>Fájl: ' . $e->getFile() . '</p>';
echo '<p>Sor: ' . $e->getLine() . '</p>';
echo '<p>Hibakód: ' . $e->getCode() . '</p>';
echo '<p>Nyom: ' . $e->getTraceAsString() . '</p>';
}
?>
A konstruktor opcionálisan a kivételüzenetet és a kivételkódot veszi figyelembe. Az üzenet általános információkat tartalmaz a hibáról, a kód segítségével pedig kategorizálhatóak a hibák.
Saját kivételek meghatározása
A programozóknak arra is lehetőségük van, hogy saját kivételkezelőket határozzanak meg, melyek más módon kezelik a különböző kivételeket. Ez a módszer lehetővé teszi, hogy külön catch blokkot alkalmazzunk minden kivételtípusra.
A saját kivétel az Exception class osztály kibővítése által lehetséges. A saját kivétel örökölni fog minden tulajdonságot és módszert a PHP Exception class osztályától, de saját módszerek is hozzáadhatóak.
PHP-kód:
<?php
// Az Exception class kibővítése
class EmptyEmailException extends Exception {}
class InvalidEmailException extends Exception {}
$email = 'someuser@example..com';
try {
// Kivétel dobása, ha az email üres
if ($email == '') {
throw new EmptyEmailException('<p>Kérem írja be az email címét!</p>');
}
// Kivétel dobása, ha az email nem érvényes
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException('<p><b>' . $email . '</b> nem érvényes email cím!</p>');
}
// Üzenet megjelenítése, ha a cím érvényes
echo '<p>SIKER: Az email validálása sikeres volt.</p>';
} catch (EmptyEmailException $e) {
echo $e->getMessage();
} catch (InvalidEmailException $e) {
echo $e->getMessage();
}
?>
Példánkban az alaposztályból két új osztályt deriváltunk, az EmptyEmailExceptiont és az InvalidEmailExceptiont.
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:
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.