Wyjątki PHP
Co to jest wyjątek?
Wyjątek to obiekt opisujący błąd lub nieoczekiwane zachowanie skryptu PHP.
Wiele funkcji i klas PHP zgłasza wyjątki.
Funkcje i klasy zdefiniowane przez użytkownika mogą również zgłaszać wyjątki.
Wyjątki to dobry sposób na zatrzymanie funkcji, gdy napotka dane, których nie może użyć.
Zgłaszanie wyjątku
Instrukcja throw
umożliwia zdefiniowanej przez użytkownika funkcji lub metodzie zgłoszenie wyjątku. Gdy zostanie zgłoszony wyjątek, następujący po nim kod nie zostanie wykonany.
Jeśli wyjątek nie zostanie przechwycony, wystąpi błąd krytyczny z komunikatem „Nieprzechwycony wyjątek”.
Spróbujmy rzucić wyjątek bez przechwytywania:
Przykład
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
Wynik będzie wyglądał mniej więcej tak:
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
Oświadczenie try...catch
Aby uniknąć błędu z powyższego przykładu, możemy użyć
try...catch
instrukcji do przechwycenia wyjątków i kontynuowania procesu.
Składnia
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}
Przykład
Pokaż komunikat, gdy zostanie zgłoszony wyjątek:
<?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 wskazuje, jaki typ wyjątku powinien zostać przechwycony oraz nazwę zmiennej, która może być użyta do uzyskania dostępu do wyjątku. W powyższym przykładzie typ wyjątku to Exception
, a nazwa zmiennej to $e
.
Próba... złapać... w końcu Oświadczenie
Instrukcja try...catch...finally
może służyć do przechwytywania wyjątków. Kod w
finally
bloku będzie zawsze działał niezależnie od tego, czy został przechwycony wyjątek. Jeśli
finally
jest obecny, catch
blok jest opcjonalny.
Składnia
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
}
Przykład
Pokaż komunikat, gdy zostanie zgłoszony wyjątek, a następnie wskaż, że proces się zakończył:
<?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.";
}
?>
Przykład
Wypisuje ciąg, nawet jeśli nie został przechwycony wyjątek:
<?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.";
}
?>
Obiekt wyjątku
Obiekt Exception zawiera informacje o błędzie lub nieoczekiwanym zachowaniu napotkanym przez funkcję.
Składnia
new Exception(message, code, previous)
Wartości parametrów
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
Podczas przechwytywania wyjątku w poniższej tabeli przedstawiono niektóre metody, których można użyć do uzyskania informacji o wyjątku:
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 |
Przykład
Wyświetl informacje o zgłoszonym wyjątku:
<?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";
}
?>
Pełne odniesienie do wyjątków
Aby uzyskać pełne informacje, przejdź do naszej Kompletnej dokumentacji wyjątków PHP .
Odwołanie zawiera opisy i przykłady wszystkich metod Exception.