Исключения PHP
Что такое исключение?
Исключение — это объект, описывающий ошибку или неожиданное поведение PHP-скрипта.
Исключения генерируются многими функциями и классами PHP.
Определенные пользователем функции и классы также могут генерировать исключения.
Исключения — это хороший способ остановить функцию, когда она сталкивается с данными, которые она не может использовать.
Создание исключения
Оператор throw
позволяет определяемой пользователем функции или методу генерировать исключение. При возникновении исключения код, следующий за ним, выполняться не будет.
Если исключение не перехвачено, произойдет фатальная ошибка с сообщением «Неперехваченное исключение».
Давайте попробуем сгенерировать исключение, не перехватывая его:
Пример
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
Результат будет выглядеть примерно так:
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
Оператор try...catch
Чтобы избежать ошибки из приведенного выше примера, мы можем использовать
try...catch
оператор для перехвата исключений и продолжения процесса.
Синтаксис
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}
Пример
Показывать сообщение при возникновении исключения:
<?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.";
}
?>
Блок catch указывает, какой тип исключения следует перехватывать, и имя переменной, которая может использоваться для доступа к исключению. В приведенном выше примере тип исключения Exception
и имя переменной $e
.
Попробуй... поймай... наконец Заявление
Оператор try...catch...finally
может использоваться для перехвата исключений. Код в
finally
блоке всегда будет выполняться независимо от того, было ли перехвачено исключение. Если
finally
присутствует, catch
блок является необязательным.
Синтаксис
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
}
Пример
Показывать сообщение при возникновении исключения, а затем указывать, что процесс завершен:
<?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.";
}
?>
Пример
Вывести строку, даже если исключение не было перехвачено:
<?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.";
}
?>
Объект исключения
Объект исключения содержит информацию об ошибке или неожиданном поведении, с которым столкнулась функция.
Синтаксис
new Exception(message, code, previous)
Значения параметров
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 |
Методы
При перехвате исключения в следующей таблице показаны некоторые методы, которые можно использовать для получения информации об исключении.
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 |
Пример
Вывести информацию о выброшенном исключении:
<?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";
}
?>
Полный справочник исключений
Полную справку см. в нашем Полном справочнике по исключениям PHP .
Справочник содержит описания и примеры всех методов Exception.