Výjimky PHP
Co je to výjimka?
Výjimkou je objekt, který popisuje chybu nebo neočekávané chování PHP skriptu.
Výjimky jsou vyvolány mnoha funkcemi a třídami PHP.
Uživatelem definované funkce a třídy mohou také vyvolávat výjimky.
Výjimky jsou dobrým způsobem, jak zastavit funkci, když narazí na data, která nemůže použít.
Vyhození výjimky
Příkaz throw
umožňuje uživatelsky definované funkci nebo metodě vyvolat výjimku. Když je vyvolána výjimka, kód následující po ní nebude proveden.
Pokud výjimka není zachycena, dojde k závažné chybě se zprávou "Uncaught Exception".
Zkusme vyvolat výjimku, aniž bychom ji zachytili:
Příklad
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
Výsledek bude vypadat nějak takto:
Fatal error: Uncaught Exception: Division by zero in
C:\webfolder\test.php:4
Stack trace: #0 C:\webfolder\test.php(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4
Prohlášení o pokusu...úlovku
Abychom se vyhnuli chybě z výše uvedeného příkladu, můžeme použít
try...catch
příkaz k zachycení výjimek a pokračovat v procesu.
Syntax
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}
Příklad
Zobrazit zprávu při vyvolání výjimky:
<?php
function divide($dividend, $divisor) {
if($divisor ==
0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo
divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide.";
}
?>
Blok catch označuje, jaký typ výjimky má být zachycen a název proměnné, kterou lze použít pro přístup k výjimce. Ve výše uvedeném příkladu je typ výjimky Exception
a název proměnné je $e
.
Prohlášení pokus...úlovek...konečně
Příkaz try...catch...finally
lze použít k zachycení výjimek. Kód v
finally
bloku se vždy spustí bez ohledu na to, zda byla zachycena výjimka. Pokud
finally
je přítomen, catch
blok je volitelný.
Syntax
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
} finally {
code that
always runs regardless of whether an exception was caught
}
Příklad
Při vyvolání výjimky zobrazit zprávu a poté označit, že proces skončil:
<?php
function divide($dividend, $divisor) {
if($divisor
== 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo
divide(5, 0);
} catch(Exception $e) {
echo "Unable to
divide. ";
} finally {
echo "Process complete.";
}
?>
Příklad
Výstup řetězce, i když výjimka nebyla zachycena:
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo
"Process complete.";
}
?>
Objekt výjimky
Objekt výjimky obsahuje informace o chybě nebo neočekávaném chování, ke kterému funkce narazila.
Syntax
new Exception(message, code, previous)
Hodnoty parametrů
Parameter | Description |
---|---|
message | Optional. A string describing why the exception was thrown |
code | Optional. An integer that can be used used to easily distinguish this exception from others of the same type |
previous | Optional. If this exception was thrown in a catch block of another exception, it is recommended to pass that exception into this parameter |
Metody
Při zachycení výjimky ukazuje následující tabulka některé z metod, které lze použít k získání informací o výjimce:
Method | Description |
---|---|
getMessage() | Returns a string describing why the exception was thrown |
getPrevious() | If this exception was triggered by another one, this method returns the previous exception. If not, then it returns null |
getCode() | Returns the exception code |
getFile() | Returns the full path of the file in which the exception was thrown |
getLine() | Returns the line number of the line of code which threw the exception |
Příklad
Výstupní informace o výjimce, která byla vyvolána:
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero", 1);
}
return $dividend / $divisor;
}
try {
echo
divide(5, 0);
} catch(Exception $ex) {
$code = $ex->getCode();
$message = $ex->getMessage();
$file = $ex->getFile();
$line = $ex->getLine();
echo "Exception thrown in $file on line
$line: [Code $code]
$message";
}
?>
Kompletní odkaz na výjimky
Úplnou referenci najdete v naší kompletní referenční výjimce PHP .
Odkaz obsahuje popisy a příklady všech metod výjimek.