PHP Try Catch Példa: Kivételek és hibakezelés oktatóanyag
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.
Ez alól kivétel a váratlan programeredmény, amelyet maga a program is kezelhet.
A kivételek közé tartozik például egy nem létező fájl megnyitásának kísérlete.
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 kezeljük a kivételt?
- Kerülje el a váratlan eredményeket oldalainkon, amelyek nagyon bosszantóak vagy irritálóak lehetnek a végfelhasználók 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ételek a program normál menetének megváltoztatására szolgálnak, 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ódot kínál a hibák kezelésére.
Három (3) általánosan használt módszert fogunk megvizsgálni;
- Die nyilatkozatok– a die funkció egyesíti a visszhang és a kilépés funkciót egyben. Nagyon hasznos, ha üzenetet akarunk kiadni, és hiba esetén leállítjuk 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ásaitól függően. Ez a módszer nagyon hasznos fejlesztői környezetben, amikor fogalma sincs, mi okozta a hibát. A megjelenített információk segíthetnek az alkalmazás hibakeresésében.
Hibakezelési példák
Nézzünk most néhány egyszerű példát a hibakezelési rutinokra.
Tegyük fel, hogy kifejlesztettünk egy alkalmazást, amely szöveges fájlokat használ az adatok tárolására. Érdemes ellenőrizni a fájl létezését, mielőtt adatokat próbálnánk kiolvasni belőle.
Az alábbi kód a fenti példát valósítja meg.
<?php $denominator = 0; echo 2 / $denominator; ?>
Feltéve, hogy a simple_error.php fájlt a phptuts mappába mentette, nyissa meg az URL-t 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.
A fenti kódot módosítjuk és hibakezelőt írunk az alkalmazáshoz
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Feltéve, hogy a fenti kódot error_handling.php néven mentette, nyissa meg az URL-t http://localhost/phptuts/error_handling.php
Jegyzet: bevált biztonsági gyakorlat, ha a „Fájl nem található” üzenet helyett a fent látható módon jelenít meg egy üzenetet.
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 "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Nyissa meg az URL-t http://localhost/phptuts/custom_error_handler.php a következő eredményeket kapja
Amint a fenti példából látható, az egyéni hibakezelők abban az értelemben hatékonyak
- Lehetővé teszik számunkra a hibaüzenetek testreszabását.
- Az egyéni hibakezelő tartalmazhat hibanaplózást is egy fájlban/adatbázisban, e-mail küldést a fejlesztőnek stb.
Nézzük most a hibakezelés harmadik típusát. A PHP beépített error_reporting függvényét fogjuk használni. A következő alapvető szintaxissal rendelkezik
<?php error_reporting($reporting_level); ?>
ITT,
- Az „error_reporting” a PHP hibajelentési funkciója
- A „$jelentési_szint” nem kötelező, 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. | hibabejelentés(E_ NOTICE); |
E_USER_ERROR | Megjeleníti a felhasználó által generált hibákat, azaz az egyéni hibakezelőt | hibabejelenté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 | Olyan hibákat jelenít meg, 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 előfordulnak, és elkapni szándékoznak, miközben a hibák általában nem javíthatók.
- A kivételek kezelése tárgyorientált módon történik. Ez azt jelenti, amikor kivételt dobnak; létrejön egy kivételobjektum, amely tartalmazza a kivétel részleteit.
Az alábbi táblázat a kivételobjektum metódusait mutatja be
Módszer | Leírás | Példa |
---|---|---|
getMessage() | Megjeleníti a kivétel üzenetét |
<?php echo $e->getMessage(); ?> |
megkapni a kódot() | 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(); ?> |
getTrace() | Megjeleníti a visszakövetés tömbjét 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(); ?> |
getTraceAsString() | A kivétel visszakövetését karakterláncként jeleníti meg 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(…)” létrehoz egy kivételobjektumot, és átadja az „Ez egy kivétel példa” karakterláncot üzenetparaméterként.
A fenti kód a következő üzenetet adja ki.
Most egy példát fogunk nézni, amely megvalósítja a dobás és elkapás kivételeit.
Módosítjuk a fenti példát, és beletesszük a try, dobás és elkapás kifejezést.
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 az alapvető kivételpéldát mutatja be a try, throw és catch kivétellel.
A program szándékosan kivételt dob, amit 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 az URL-t http://localhost/phptuts/exception_handling.php A következő eredményeket kapja.
Az is lehetséges, hogy egy php try utasításhoz több kivételt is létrehozhatunk, a feladott 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
A többszörös kivételek többszörös try catch blokkot használnak a dobott kivételek kezelésére. 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 a több kivétel működését
Nézzünk egy példát, amely több kivételt is használ.
Módosítjuk azt a kódot, amely eloszt egy számot 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 a fogási blokkokban csak a kivétel típusát jelenítjük meg.
Az Exception osztályba épített PHP kivételek dobására szolgál.
Létrehozunk két osztályt, amelyek kiterjesztik a kivételosztályt, és kivételek dobására használjuk őket.
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 mentette.
Keresse meg az URL-t 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ó.
Keresse meg az URL-t http://localhost/phptuts/multiple_exceptions.php.
Milyen eredményeket ér el? Paraméterként adja meg a 3-at.
Milyen eredményeket ér el?
Összegzésként
- A hibák a PHP kód által előidézett váratlan eredmények
- A hibakezelés javítja az alkalmazás teljesítményét
- A PHP beépített funkciókkal rendelkezik, amelyek segítségével testreszabható a PHP hibajelentési módja
- A kivételek olyanok, mint a hibák, de dobáskor elkaphatók a fogóblokk használatával.
- A hibainformációkat megjelenítő hibaüzenetek megjelenítése rossz biztonsági gyakorlatnak minősül.