Izjema je predmet, ki opisuje napako ali nepričakovano vedenje PHP skripta, ki jih povzročajo številne funkcije in razredi. Uporabniško določene funkcije in razredi lahko vržejo tudi izjeme. So dober način za zaustavitev funkcije, ko naleti na podatek, ki ga ne more uporabiti. Izjava omogoča uporabniško določeni funkciji ali metodi, da zažene izjemo. Če izjema ni ujeta, se bo pojavila napaka s sporočilom.
Poskusimo ustvariti izjemo, ne da bi jo ujeli.
<?php function delilnik($delitelj, $delilec) { if ($delilec == 0) { throw new Exception("Deljenje z ničlo."); } return $delitelj / $delilec; } echo delilnik(13, 0);
C:\xampp\php\php.exe -c C:\xampp\php\php.ini "C:\Users\" PHP Fatal error: Uncaught Exception: Deljenje z ničlo. Stack trace: #0 C:\: delilnik(13, 0) #1 {main} thrown in C:\ Process finished with exit code 255
Da bi se izognili napaki iz zgornjega primera, lahko uporabimo stavek try...catch za lovljenje (catch) izjem in nadaljevanje postopka.
Sintaksa: try { koda, ki lahko vrže izjemo } catch(Exception $e) { koda, ki se zažene, ko je izjema ujeta }
<?php function delilnik($delitelj, $delilec) { if ($delilec == 0) { throw new Exception("Deljenje z ničlo."); } return $delitelj / $delilec; } try { echo delilnik(13, 0); } catch (Exception $e) { echo "\nDelitev ni mogoča.\n"; }
C:\xampp\php\php.exe -c C:\xampp\php\php.ini "C:\Users\" Delitev ni mogoča. Process finished with exit code 0
Blok catch označuje vrsto izjeme, ki jo je potrebno ujeti, in ime spremenljivke, ki jo je mogoče uporabiti za dostop do izjeme. V zgornjem primeru je vrsta izjeme Exception, ime spremenljivke pa $e.
Stavek try...catch...finally lahko uporabimo za lovljenje izjem. Koda v bloku finally se bo vedno izvajala ne glede na to, ali je bila ujeta izjema, če je izjema finally prisotna, block catch ni obvezen.
Sintaksa: try { koda, ki lahko vrže izjemo } catch(Exception $e) { koda, ki se zažene, ko je izjema ujeta } finally { koda, ki se vedno izvaja ne glede na to ali je bila izjema ujeta }
Prikaže sporočilo, ko je izjema (Exception) izvržena in nato označi, de je postopek končan.
<?php function delilnik($delitelj, $delilec) { if ($delilec == 0) { throw new Exception("Deljenje z ničlo."); } return $delitelj / $delilec; } try { echo delilnik(13, 0); } catch (Exception $e) { echo "\nNapaka: " . $e->getMessage() . "\n"; } finally { echo "Postopek je končan.\n"; }
C:\xampp\php\php.exe -c C:\xampp\php\php.ini "C:\Users\" Napaka: Deljenje z ničlo. Postopek je končan. Process finished with exit code 0
Kaj pa če izjema (Exception) ni ujeta? Poglejmo si primer:
<?php function delilnik($delitelj, $delilec) { if ($delilec == 0) { throw new Exception("Deljenje z ničlo."); } return $delitelj / $delilec; } try { echo delilnik(13, 0); } finally { echo "\nPostopek je končan.\n"; }
C:\xampp\php\php.exe -c C:\xampp\php\php.ini "C:\Users\" PHP Fatal error: Uncaught Exception: Deljenje z ničlo. in C:\Users\:5 Stack trace: #0 C:\Users\(11): delilnik(13, 0) #1 {main} thrown in C:\Users\ on line 5 Postopek je končan. Fatal error: Uncaught Exception: Deljenje z ničlo. in C:\Users\:5 Stack trace: #0 C:\Users\(11): delilnik(13, 0) #1 {main} thrown in C:\Users\ on line 5 Process finished with exit code 255
Kljub temu, da nam izpiše "Postopek je končan", nam tudi vrže napako, ker manjka blok catch za vrženo izjemo, kar pomeni, da izjema ne bo pravilno ujeta in obravnavana, preden se izvede končni blok.
Objekt Exception vsebuje informacije o napaki ali nepričakovanem vedenju, na katerega je naletela funkcija.
Sintaksa: new Exception(sporočilo, koda, izjema)
Parameter | Opis |
---|---|
sporočilo | Neobvezno. Niz, ki opisuje, zakaj je bila izjema vržena. |
koda | Neobvezno. Celo število, ki ga je mogoče uporabiti za preprosto razlikovanje te izjeme od drugih istega tipa. |
izjema | Neobvezno. Če je bila ta izjema vržena v bloku catch druge izjeme je priporočljivo, da to izjemo posredujemo v ta parameter. |
Izjeme uporabljajo funkcije in metode za pošiljanje informacij o napakah in nepričakovanem vedenju. Pri lovljenju izjeme naslednja tabela prikazuje nekatere metode, ki jih je mogoče uporabiti za pridobivanje informacij o izjemi. Objekt Exception nima javnih lastnosti, ima pa zasebne in zaščitene lastnosti, v katere je mogoče zapisati ali prebrati z uporabo konstruktorja in metod.
Metoda | Opis | Primer |
---|---|---|
Exception() | Konstruktor objekta Exception. | Glej primer |
getCode() | Vrne kodo izjeme. | Glej primer |
getFile() | Vrne celotno pot datoteke, v kateri je bila izjema vržena. | Glej primer |
getLine() | Vrne številko vrstice, ki je povzročila izjemo. | Glej primer |
getMessage() | Vrne niz, ki opisuje zakaj je bila izjema vržena. | Glej primer |
getPrevious() | Če je to izjemo sprožila druga izjema, vrne prejšnjo izjemo, drugače ne vrne ničesar. | Glej primer |
getTrace() | Vrne matriko z informacijami o vseh funkcijah, ki so se izvajale v času, ko je bila vržena izjema. | Glej primer |
getTraceAsString() | Vrne iste informacije kot getTrace(), vendar v nizu. | Glej primer |