PHP Try Catch Primjer: Vodič za rukovanje iznimkama i pogreškama

Što je iznimka?

Pogreška je neočekivani rezultat programa koji sam program ne može riješiti.

Greške se rješavaju popravkom programa. Primjer pogreške bila bi beskonačna petlja koja nikada ne prestaje izvršavati.

Iznimka je neočekivani programski rezultat koji sam program može riješiti.

Primjeri izuzetaka uključuju pokušaj otvaranja datoteke koja ne postoji.

Ova se iznimka može riješiti bilo stvaranjem datoteke ili predstavljanjem korisniku mogućnosti traženja datoteke.

Zašto rješavati iznimke?

  • Izbjegnite neočekivane rezultate na našim stranicama koji mogu biti vrlo neugodni ili iritantni za naše krajnje korisnike
  • Poboljšajte sigurnost naših aplikacija tako da ne otkrivate informacije koje zlonamjerni korisnici mogu koristiti za napad na naše aplikacije
  • Php iznimke koriste se za promjenu normalnog tijeka programa ako se dogodi bilo kakva predvidljiva pogreška.

PHP obrada grešaka

Kada se pojavi pogreška, ovisno o postavkama konfiguracije, PHP prikazuje poruku o pogrešci u web pregledniku s informacijama koje se odnose na pogrešku koja se dogodila.

PHP nudi brojne načine rješavanja pogrešaka.

Pogledat ćemo tri (3) najčešće korištene metode;

  1. Die izjave– funkcija die kombinira funkciju odjeka i izlaza u jednu. Vrlo je korisno kada želimo ispisati poruku i zaustaviti izvršavanje skripte kada se pojavi greška.
  2. Prilagođeni rukovatelji pogreškama – ovo su korisnički definirane funkcije koje se pozivaju kad god se pojavi pogreška.
  3. PHP izvješćivanje o pogrešci – poruka o pogrešci ovisno o vašim PHP postavkama izvješćivanja o pogrešci. Ova metoda je vrlo korisna u razvojnom okruženju kada nemate pojma što je uzrokovalo pogrešku. Prikazane informacije mogu vam pomoći u otklanjanju pogrešaka u aplikaciji.

Primjeri rješavanja pogrešaka

Pogledajmo sada neke jednostavne primjere s rutinama za obradu grešaka.

Pretpostavimo da smo razvili aplikaciju koja koristi tekstualne datoteke za pohranu podataka. Možda bismo željeli provjeriti postojanje datoteke prije nego što pokušamo pročitati podatke iz nje.

Kod u nastavku implementira gornji primjer.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Pod pretpostavkom da ste datoteku simple_error.php spremili u mapu phptuts, otvorite URL http://localhost/phptuts/simple_error.php

Dobit ćete sljedeće rezultate

PHP obrada grešaka

Kao što možete vidjeti iz gornjih rezultata, zbog toga naša aplikacija izgleda neprofesionalno i može smetati korisniku.

Izmijenit ćemo gornji kod i napisati rukovatelj greškama za aplikaciju

<?php
$denominator = 0;
if ($denominator != 0) {
    echo 2 / $denominator;
} else {
    echo "cannot divide by zero (0)";
}
?>

Pod pretpostavkom da ste spremili gornji kod kao error_handling.php, otvorite URL http://localhost/phptuts/error_handling.php

Ručka PHP iznimke u PHP-u

Bilješka: dobra je sigurnosna praksa prikazati poruku kao što je gore prikazana umjesto prikazivanja poruke poput "Datoteka nije pronađena".

Pogledajmo još jedan primjer koji koristi prilagođeni rukovatelj greškama.

Prilagođeni rukovatelj pogreškama bit će postavljen kao zadana PHP funkcija za rukovanje pogreškama i u osnovi će prikazati broj pogreške i poruku.

Kod u nastavku ilustrira implementaciju gornjeg primjera

<?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);
?>

Otvorite URL http://localhost/phptuts/custom_error_handler.php dobit ćete sljedeće rezultate

. PHP obrada grešaka


Kao što možete vidjeti iz gornjeg primjera, prilagođeni rukovatelji pogreškama moćni su u smislu da

  • Omogućuju nam da prilagodimo poruke o greškama.
  • Prilagođeni rukovatelj pogreškama također može uključivati ​​bilježenje pogrešaka u datoteku/bazu podataka, slanje e-pošte programeru itd.

Pogledajmo sada treću vrstu rukovanja pogreškama. Koristit ćemo PHP ugrađenu funkciju error_reporting funkciju. Ima sljedeću osnovnu sintaksu

<?php
error_reporting($reporting_level);
?>

OVDJE,

  • “error_reporting” je PHP funkcija za prijavu pogrešaka
  • “$reporting_level” nije obavezan, može se koristiti za postavljanje razine izvješćivanja. Ako nije određena razina izvješćivanja, PHP će koristiti zadanu razinu izvješćivanja o pogreškama kako je navedeno u datoteci php.ini.
Razina izvješćivanja Description Primjer
E_UPOZORENJE Prikazuje samo poruke upozorenja. Ne zaustavlja izvršenje skripte javljanje_pogreške(E_UPOZORENJE);
E_OBAVIJEST Prikazuje obavijesti koje se mogu pojaviti tijekom normalnog izvođenja programa ili mogu biti pogreška. javljanje_pogreške(E_OBAVIJEST);
E_USER_ERROR Prikazuje pogreške koje je generirao korisnik, tj. prilagođeni rukovatelj pogreškama javljanje_pogreške(E_ KORISNIČKA_GREŠKA);
E_USER_WARNING Prikazuje poruke upozorenja koje je izradio korisnik javljanje_pogreške(E_USER_WARNING);
E_USER_OBAVIJEST Prikazuje obavijesti koje je izradio korisnik javljanje_pogreške(E_USER_NOTICE);
E_RECOVERABLE_ERROR Prikazuje pogreške koje nisu kobne i s kojima se može rukovati pomoću prilagođenih rukovatelja pogreškama javljanje_pogreške(E_RECOVERABLE_ERROR);
E_SVE Prikazuje sve pogreške i upozorenja javljanje_pogreške(E_ SVE);

Razlika između pogrešaka i iznimke

  • Iznimke su bačene i namijenjene su za hvatanje, dok su pogreške općenito nepopravljive.
  • Iznimkama se rukuje na objektno orijentiran način. To znači kada se izbaci iznimka; stvara se objekt iznimke koji sadrži detalje iznimke.

Donja tablica prikazuje metode izuzetih objekata

način Description Primjer
getMessage() Prikazuje poruku o iznimci
<?php
echo $e->getMessage();
?>
getCode() Prikazuje numerički kod koji predstavlja iznimku
<?php
echo $e->getCode();
?>
getFile() Prikazuje naziv datoteke i stazu gdje je došlo do iznimke
<?php
echo $e->getFile();
?>
getLine() Prikazuje broj retka u kojem je došlo do iznimke
<?php
echo $e->getLine();
?>
getTrace() Prikazuje niz povratnog traga prije iznimke
<?php
print_r( $e->getTrace());
?>
getPrethodni() Prikazuje prethodnu iznimku prije trenutne
<?php
echo $e->getPrevious();
?>
getTraceAsString() Prikazuje povratni trag iznimke kao niz umjesto niza
<?php
echo $e->getTraceAsString();
?>
__toString() Prikazuje cijelu iznimku kao niz
<?php
echo $e->__toString();
?>


Ispod je osnovna sintaksa za izbacivanje iznimke.

<?php
throw new Exception("This is an exception example");
?>

OVDJE,

  • "baci" je ključna riječ koja se koristi za izbacivanje iznimke
  • “new Exception(…)” stvara objekt iznimke i prosljeđuje niz “Ovo je primjer iznimke” kao parametar poruke.

Gornji kod ispisuje sljedeću poruku.

Ručka PHP iznimke u PHP-u

Sada ćemo pogledati primjer koji implementira iznimke bacanja i hvatanja.

Izmijenit ćemo gornji primjer i uključiti pokušaj, bacanje i hvatanje.

Ima sljedeću osnovnu sintaksu.

<?php
try {
    //code goes here that could potentially throw an exception
}
catch (Exception $e) {
    //exception handling code goes here
}
?>

OVDJE,

  • “pokušaj{…}” je blok koda koji se treba izvršiti i koji potencijalno može pokrenuti iznimku
  • “catch(Exception $e){…}” je blok koda koji hvata izbačenu iznimku i dodjeljuje objekt iznimke varijabli $e.

Kod u nastavku prikazuje osnovni primjer iznimke s implementiranom iznimkom try, throw i catch.

Program namjerno baca iznimku koju zatim hvata.

<?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();
}
?>

Otvorite URL http://localhost/phptuts/exception_handling.php Dobit ćete sljedeće rezultate.

Ručka PHP iznimke u PHP-u

Također je moguće stvoriti više iznimaka za jednu php try naredbu, ovisno o vrsti izbačene iznimke.

Pogledajte članak na MySQL, PHP pristup podacima… za primjere implementacije višestrukih iznimaka

Višestruke iznimke

Višestruke iznimke koriste višestruke blokove try catch za rukovanje izbačenim iznimkama. Višestruke iznimke korisne su kada;

  • Želite prikazati prilagođenu poruku ovisno o izbačenoj iznimci
  • Želite izvesti jedinstvenu operaciju ovisno o izbačenoj iznimci

Dijagram toka u nastavku ilustrira kako funkcioniraju višestruke iznimke

Višestruke iznimke

Pogledajmo primjer koji koristi više iznimaka.

Modificirat ćemo kod koji dijeli broj proslijeđenim nazivnikom.

Očekujemo da će se pojaviti dvije vrste iznimaka;

  • Podjela na nulu
  • Dijeljenje negativnim brojem

Radi jednostavnosti, prikazat ćemo samo tip iznimke u našim catch blokovima.

PHP ugrađen u Exception klasu koristi se za bacanje iznimaka.

Stvorit ćemo dvije klase koje proširuju klasu iznimke i koristiti ih za izbacivanje iznimki.

Kod u nastavku prikazuje implementaciju.

<?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);
?>

Testiranje koda

Pretpostavit ćemo da ste spremili multiple_exceptions.php u mapu phptuts.

Dođite do URL-a http://localhost/phptuts/multiple_exceptions.php

Ručka PHP iznimke u PHP-u

Vratite se na PHP datoteku i proslijedite -1 kao parametar kao što je prikazano na sljedećem dijagramu.

Ručka PHP iznimke u PHP-u

Dođite do URL-a http://localhost/phptuts/multiple_exceptions.php.

Kakve rezultate postižete? Proslijedite 3 kao parametar.

Kakve rezultate postižete?

rezime

  • Pogreške su neočekivani rezultati koje proizvodi PHP kod
  • Rješavanje pogrešaka poboljšava performanse aplikacije
  • PHP ima ugrađene funkcije koje se mogu koristiti za prilagodbu načina na koji PHP javlja pogreške
  • Iznimke su poput pogrešaka, ali se mogu uhvatiti pomoću bloka za hvatanje kada se bace.
  • Prikazivanje poruka o pogrešci koje prikazuju informacije o pogrešci smatra se lošom sigurnosnom praksom.