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;
- 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.
- Prilagođeni rukovatelji pogreškama – ovo su korisnički definirane funkcije koje se pozivaju kad god se pojavi pogreška.
- 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
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
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
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.
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.
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
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
Vratite se na PHP datoteku i proslijedite -1 kao parametar kao što je prikazano na sljedećem dijagramu.
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.