PHP-kivételkezelés

PHP-kivételkezelés

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:

Melyik állítással tudunk új kivételt előidézni?
1. try
2. catch
3. throw
 
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.

Szeretne értesülni, ha új cikk jelenik meg Számtek rovatunkban? Iratkozzon fel értesítőnkre!

E-mailben értesíteni fogjuk Önt az új cikkekről. Feliratkozáshoz kérjük adja meg a nevét és az e-mail címét.

Hozzászólások

Kapcsolódó cikkek

PHP-kivételkezelés
Számtek
  • Erdsoft
  • 2019.09.25.
  • LXXIV. évfolyam 38. szám
PHP-kivételkezelés
Számtek
  • Erdsoft
  • 2019.09.18.
Facebook

Támogatóink