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.

  • ⚠️ Hiba vs. kivétel: Egy hiba általában helyrehozhatatlan, míg egy kivétel egy váratlan eredmény, amelyet a program képes észlelni és kezelni.
  • 🛡️ Miért kell kezelni: A hibák kezelése megakadályozza a csúnya kimenetet, védi a felhasználókat, és megakadályozza a kiszivárgó részleteket, amelyeket a támadók kihasználhatnak.
  • 🛑 Die utasítások: A die függvény kiír egy üzenetet és leállítja a szkriptet, ami egy gyors módja a végrehajtás leállításának, ha valami nem sikerül.
  • 🇧🇷 Egyéni kezelők: A set_error_handler() függvény a hibákat a saját függvényedhez irányítja, így tetszés szerint naplózhatod, e-mailben elküldheted vagy formázhatod az üzeneteket.
  • 📢 Hibabejelentés: Az error_reporting() függvény és az olyan szintek, mint az E_ALL, szabályozzák, hogy a PHP mely figyelmeztetéseket és értesítéseket jelenítse meg, ami hasznos a fejlesztés során.
  • 🧲 Próbáld, Dobd, Kapd el: Egy try blokk kockázatos kódot futtat, a throw kivételt generál, a catch pedig kivételt kezel az exception objektummetódusok segítségével.
  • 🤖 AI Assist: A mesterséges intelligencia eszközei hozzáadhatják a try-catch kezelést a meglévő kódhoz, és megmagyarázhatják a zavaros kódverem működését. trace vagy hibaüzenet.

PHP hibakezelés és kivételek

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:

  1. 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.
  2. Egyedi hibakezelők – ezek a felhasználó által definiált függvények, amelyek hiba esetén mindig meghívásra kerülnek.
  3. 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.

PHP hibakezelés

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

PHP kivételek kezelése PHP-ben

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.

PHP hibakezelés

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.

PHP kivételek kezelése PHP-ben

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.

PHP kivételek kezelése PHP-ben

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.

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

PHP kivételek kezelése PHP-ben

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ó.

PHP kivételek kezelése PHP-ben

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.

GYIK

Éles környezetben a php.ini fájlban állítsd a display_errors paramétert Off, a log_errors paramétert pedig On értékre, és irányítsd az error_log függvényt egy fájlra. Az error_log('message') függvényt is meghívhatod egyéni bejegyzések rögzítéséhez anélkül, hogy bármit is megjelenítenél a látogatók számára.

A try-catch függvény a throw kulcsszóval generált kivételeket kezeli. A set_error_handler a hagyományos PHP hibákat és figyelmeztetéseket kezeli. A PHP 7-ben és későbbi verziókban számos korábbi hiba Error objektumként jelenik meg, amelyeket szintén elkaphatsz.

Egy el nem fogott kivétel végzetes hibává válik, leállítja a szkriptet, és egy el nem fogott kivétel üzenetet ír ki egy veremmel együtt. trace. Egy set_exception_handler paraméterrel beállított globális kezelő végső megoldásként képes ezeket elkapni.

Igen. A mesterséges intelligencia képes kockázatos műveleteket try-catch blokkokba csomagolni, kiválasztani a megfelelő kivételtípusokat, hozzáadni egy finally blokkot a tisztításhoz, és naplózni a hibát. Revlásd, hogy nem nyeli el a kivételeket, amiket látnod kell.

Igen. Illeszd be az üzenetet, és trace, és a mesterséges intelligencia képes azonosítani a hibás vonalat, az oda vezető hívásláncot és a valószínűsíthető okot, majd javaslatot tesz egy javításra, például nullellenőrzésre vagy argumentum javítására.

Foglald össze ezt a bejegyzést a következőképpen: