PHP Try Catch Példa: Kivételek és hibakezelés oktatóanyag
⚡ Okos összefoglaló
A PHP hibakezelése és kivételei stabilan és biztonságosan tartják az alkalmazásokat azáltal, hogy a nyers hibák feltárása helyett a váratlan feltételeket kezelik. Ez az útmutató bemutatja a hibákat és kivételeket, a die utasításokat, az egyéni hibakezelőket, a hibajelentési szinteket, valamint a try, throw és catch kivételmodellt többféle kivételtípussal.

Mi a kivétel?
A hiba olyan váratlan programeredmény, amelyet maga a program nem tud kezelni.
A hibák kijavítása a program javításával történik. Példa a hibára egy végtelen ciklus, amely soha nem hagyja abba a végrehajtást.
A kivétel egy váratlan programeredmény, amelyet maga a program képes kezelni.
Kivételre példa lehet egy nem létező fájl megnyitására tett kísérlet.
Ez a kivétel kezelhető a fájl létrehozásával vagy a felhasználó számára a fájl keresésének lehetőségével.
Miért kell kivételeket kezelni?
- Kerülje el az oldalainkon megjelenő váratlan találatokat, amelyek nagyon bosszantóak vagy irritálóak lehetnek a végfelhasználóink számára.
- Növelje alkalmazásaink biztonságát azáltal, hogy nem tesz közzé olyan információkat, amelyeket a rosszindulatú felhasználók felhasználhatnak alkalmazásaink megtámadására
- A PHP kivételeket arra használjuk, hogy megváltoztassuk a program normál menetét, ha bármilyen előre látható hiba történik.
PHP hibakezelés
Ha hiba történik, a konfigurációs beállításoktól függően, PHP megjeleníti a hibaüzenetet a webböngészőben a felmerült hibára vonatkozó információkkal.
A PHP számos módszert kínál a hibák kezelésére. Három gyakran használt módszert fogunk megvizsgálni:
- Die nyilatkozatok – a die függvény az echo és az exit függvényeket egyben egyesíti. Nagyon hasznos, ha hiba esetén üzenetet szeretnénk kiírni és leállítani a szkript végrehajtását.
- Egyedi hibakezelők – ezek a felhasználó által definiált függvények, amelyek hiba esetén mindig meghívásra kerülnek.
- PHP hibajelentés – a hibaüzenet a PHP hibajelentési beállításaidtól függ. Ez a módszer nagyon hasznos fejlesztői környezetben, amikor fogalmad sincs, mi okozta a hibát. A megjelenített információk segíthetnek az alkalmazásod hibakeresésében.
Hibakezelési példák
Most nézzünk néhány egyszerű példát hibakezelési rutinokkal.
Tegyük fel, hogy van egy számítási módszerünk, amellyel egy számot el tudunk osztani nullával. Ezt az esetet szeretnénk tisztán kezelni ahelyett, hogy hagynánk, hogy a PHP nyers hibát mutasson.
Az alábbi kód a fenti példát valósítja meg.
<?php
$denominator = 0;
echo 2 / $denominator;
?>
Feltételezve, hogy a simple_error.php fájlt a phptuts mappába mentetted, nyisd meg a URL http://localhost/phptuts/simple_error.php
A következő eredményeket kapja.
Amint az a fenti eredményekből látható, ez az alkalmazásunk professzionális megjelenését eredményezi, és bosszantó lehet a felhasználó számára.
Módosítjuk a fenti kódot, és írunk egy hibakezelőt az alkalmazáshoz.
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Feltételezve, hogy a fenti kódot error_handling.php néven mentetted el, nyisd meg a URL http://localhost/phptuts/error_handling.php
Jegyzet: Jó biztonsági gyakorlat egy fent láthatóhoz hasonló üzenet megjelenítése egy nyers üzenet, például a „Fájl nem található” helyett.
Nézzünk egy másik példát, amely egyéni hibakezelőt használ.
Az egyéni hibakezelő lesz az alapértelmezett PHP hibakezelő funkció, és alapvetően egy hibaszámot és egy üzenetet jelenít meg.
Az alábbi kód a fenti példa megvalósítását szemlélteti.
<?php function my_error_handler($error_no, $error_msg) { echo "Oops, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Nyissa meg a URL http://localhost/phptuts/custom_error_handler.phpA következő eredményeket fogja kapni.
Amint a fenti példából látható, az egyéni hibakezelők hatékonyak abban az értelemben, hogy:
- Lehetővé teszik számunkra a hibaüzenetek testreszabását.
- Az egyéni hibakezelő tartalmazhatja a fájlban vagy adatbázisban történő hibanaplózást, a fejlesztőnek küldött e-mailt és hasonló műveleteket is.
Most nézzük meg a harmadik típusú hibakezelést. A PHP beépített error_reporting függvényét fogjuk használni. Ennek alapvető szintaxisa a következő.
<?php error_reporting($reporting_level); ?>
ITT,
- Az „error_reporting” a PHP hibajelentési funkciója
- A „$reporting_level” opcionális, és a jelentési szint beállítására használható. Ha nincs megadva jelentési szint, a PHP a php.ini fájlban megadott alapértelmezett hibajelentési szintet fogja használni.
| Jelentési szint | Leírás | Példa |
|---|---|---|
| E_WARNING | Csak a figyelmeztető üzeneteket jeleníti meg. Nem állítja le a forgatókönyv végrehajtását | hibabejelentés(E_FIGYELMEZTETÉS); |
| E_MEGJEGYZÉS | Figyelmeztetéseket jelenít meg, amelyek egy program normál végrehajtása során fordulhatnak elő, vagy hiba is lehet. | hibajelentés(E_ÉRTESÍTÉS); |
| E_USER_ERROR | Megjeleníti a felhasználó által generált hibákat, azaz egy egyéni hibakezelőt | hibajelentés(E_USER_ERROR); |
| E_USER_WARNING | A felhasználó által generált figyelmeztető üzeneteket jeleníti meg | hibabejelentés(E_USER_WARNING); |
| E_USER_NOTICE | Felhasználó által generált értesítéseket jelenít meg | error_reporting(E_USER_NOTICE); |
| E_RECOVERABLE_ERROR | Megjeleníti azokat a hibákat, amelyek nem végzetesek, és egyéni hibakezelőkkel kezelhetők. | hibabejelentés(E_RECOVERABLE_ERROR); |
| E_ALL | Megjeleníti az összes hibát és figyelmeztetést | hibabejelentés(E_ALL); |
Különbség a hibák és a kivételek között
- A kivételek dobódnak és elkapásra kerülnek, míg a hibák általában helyrehozhatatlanok.
- A kivételek kezelése objektumorientált módon történik. Ez azt jelenti, hogy kivétel keletkezésekor létrejön egy kivételobjektum, amely tartalmazza a kivétel részleteit.
Az alábbi táblázat a kivételobjektum-metódusokat mutatja.
| Módszer | Leírás | Példa |
|---|---|---|
| getMessage() | Megjeleníti a kivétel üzenetét |
<?php
echo $e->getMessage();
?>
|
| kapCode() | Megjeleníti a kivételt jelentő numerikus kódot |
<?php
echo $e->getCode();
?>
|
| getFile() | Megjeleníti a fájl nevét és elérési útját, ahol a kivétel előfordult |
<?php
echo $e->getFile();
?>
|
| getLine() | Megjeleníti a sor számát, ahol a kivétel történt |
<?php
echo $e->getLine();
?>
|
| kapTrace() | Megjeleníti a hátlap tömbjéttrace a kivétel előtt |
<?php print_r( $e->getTrace()); ?> |
| getPrevious() | Megjeleníti az előző kivételt az aktuális előtt |
<?php
echo $e->getPrevious();
?>
|
| kapTraceAsString() | Mutatja a hátlapottraca kivétel e-jét karakterláncként, tömb helyett |
<?php
echo $e->getTraceAsString();
?>
|
| __toString() | A teljes kivételt karakterláncként jeleníti meg |
<?php
echo $e->__toString();
?>
|
Az alábbiakban látható a kivételek megadásának alapvető szintaxisa.
<?php throw new Exception("This is an exception example"); ?>
ITT,
- A „dobás” kulcsszó a kivétel dobására szolgál
- A „new Exception(…)” függvény létrehoz egy kivételobjektumot, és üzenetparaméterként átadja az „Ez egy kivételpélda” karakterláncot.
A fenti kód a következő üzenetet adja ki.
Most egy olyan példát fogunk megvizsgálni, amely megvalósítja a throw és catch kivételeket. Módosítjuk a fenti példát, és beillesztjük a try, throw és catch kivételeket.
A következő alapvető szintaxissal rendelkezik.
<?php try { // code goes here that could potentially throw an exception } catch (Exception $e) { // exception handling code goes here } ?>
ITT,
- A „try{…}” a végrehajtandó kódblokk, amely kivételt okozhat
- A „catch(Exception $e){…}” az a kódblokk, amely elkapja a kidobott kivételt, és hozzárendeli a kivételobjektumot a $e változóhoz.
Az alábbi kód egy alapvető kivétel példáját mutatja be, amelyben a try, throw és catch metódusok implementáltak. A program szándékosan dob egy kivételt, amelyet aztán elkap.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Nyissa meg a URL http://localhost/phptuts/exception_handling.phpA következő eredményeket fogja kapni.
Több kivétel is létrehozható egyetlen PHP try utasításhoz, a kiváltott kivétel típusától függően.
Lásd a cikket MySQL, PHP adathozzáférés több kivétel megvalósítási példáihoz.
Több kivétel
Több kivétel esetén több catch blokk kezeli a kidobott kivételeket. Több kivétel akkor hasznos, ha:
- A feladott kivételtől függően testreszabott üzenetet szeretne megjeleníteni
- Egyedi műveletet szeretne végrehajtani a dobott kivételtől függően
Az alábbi folyamatábra bemutatja, hogyan működik több kivétel.
Nézzünk egy példát, amely több kivételt használ. Módosítjuk azt a kódot, amely egy számot eloszt az átadott nevezővel.
Kétféle kivételre számítunk:
- Osztás nullával
- Osztás negatív számmal
Az egyszerűség kedvéért csak a kivétel típusát fogjuk megjeleníteni a catch blokkokban. A PHP beépített Exception osztálya a kivételek dobására szolgál. Létrehozunk két osztályt, amelyek kiterjesztik az Exception osztályt, és ezeket fogjuk használni kivételek dobására.
Az alábbi kód a megvalósítást mutatja.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
A kód tesztelése
Feltételezzük, hogy a multiple_exceptions.php fájlt a phptuts mappába mentetted.
Tallózás a URL http://localhost/phptuts/multiple_exceptions.php
Váltson vissza a PHP fájlra, és adja meg a -1-et paraméterként, ahogy az a következő ábrán látható.
Tallózás a URL http://localhost/phptuts/multiple_exceptions.phpMilyen eredményeket kapsz? Most add át a 3-ast paraméterként. Milyen eredményeket kapsz?
A Finally Block és a PHP 7 hibamodell
A modern PHP két fontos elemmel bővíti a fenti modellt. A finally blokk a try és a catch blokkok után fut le, függetlenül attól, hogy történt-e kivétel, ami ideálissá teszi olyan tisztítási műveletekhez, mint egy fájl vagy adatbázis-kapcsolat lezárása.
A PHP 7 óta számos korábbi végzetes hiba Error objektumként kerül kiírásra. Mind az Exception, mind az Error implementálja a Throwable interfészt, így egy catch (\Throwable $e) blokk bármelyiket képes kezelni.
<?php try { $result = 10 / 0; } catch (DivisionByZeroError $e) { echo "Caught: " . $e->getMessage(); } finally { echo "This message always runs"; } ?>
Itt a nullával osztás DivisionByZeroError hibát eredményez PHP 8-ban, a catch blokk jelenti ezt, és a finally blokk mindig lefut, kiírva az üzenetet, hogy történt-e hiba vagy sem.








