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;

  1. 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.
  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á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

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.

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

PHP kivételek kezelése PHP-ben

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

. PHP hibakezelés


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.

PHP kivételek kezelése PHP-ben

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.

PHP kivételek kezelése PHP-ben

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

Több kivétel

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

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

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.