PHP Исключения
Что такое исключения?
Исключением является объект, описывающий ошибку или непредвиденное поведение PHP скрипта.
Многие функции и классы PHP создают исключения.
Пользовательские функции и классы также могут вызывать исключения.
Исключения - хороший способ остановить функцию, когда она обнаруживает данные, которые она не может использовать.
Выброс исключения
Оператор throw
позволяет определяемой пользователем функции или методу вызывать исключение. Когда генерируется исключение, следующий за ним код не будет выполняться.
Если исключение не обнаружено, произойдет фатальная ошибка с сообщением о "Неперехваченном исключении" ("Uncaught Exception").
Попробуем сгенерировать исключение, не улавливая его:
Пример
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Деление на ноль");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
Попробуйте сами »
Результат будет выглядеть примерно так:
Fatal error: Uncaught Exception: Деление на ноль в C:\webfolder\test.html:4
Stack trace: #0 C:\webfolder\test.html(9):
divide(5, 0) #1 {main} thrown in C:\webfolder\test.html on line 4
Инструкция try...catch
Чтобы избежать ошибки из приведенного выше примера, мы можем использовать инструкцию try...catch
для перехвата исключений и продолжения процесса.
Синтаксис
try {
код, который может генерировать исключения
} catch(Exception $e) {
код, который запускается при обнаружении исключения
}
Пример
Показывать сообщение при возникновении исключения:
<?php
function divide($dividend, $divisor) {
if($divisor ==
0) {
throw new Exception("Деление на ноль");
}
return $dividend / $divisor;
}
try {
echo
divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide.";
}
?>
Попробуйте сами »
Блок catch указывает, какой тип исключения следует перехватить, и имя переменной, которая может использоваться для доступа к исключению. В приведенном выше примере тип исключения - Exception
, а имя переменной - $e
.
Инструкция try...catch...finally
Инструкция try...catch...finally
может использоваться для перехвата исключений. Код в блоке finally
будет всегда выполняться независимо от того, было ли обнаружено исключение. Если присутствует finally
, блок catch
является необязательным.
Синтаксис
try {
код, который может генерировать исключения
} catch(Exception $e) {
код, который запускается при обнаружении исключения
} finally {
код, который всегда выполняется независимо от того, было ли обнаружено исключение
}
Пример
Показать сообщение при возникновении исключения, а затем указать, что процесс завершен:
<?php
function divide($dividend, $divisor) {
if($divisor
== 0) {
throw new Exception("Деление на ноль");
}
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("Деление на ноль");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo
"Процесс завершен.";
}
?>
Попробуйте сами »
Объект исключения
Объект исключения содержит информацию об ошибке или неожиданном поведении, с которым столкнулась функция.
Синтаксис
new Exception(message, code, previous)
Значения параметров
Параметр | Описание |
---|---|
message | Необязательный. Строка, описывающая, почему было сгенерировано исключение |
code | Необязательный. Целое число, которое можно использовать, чтобы легко отличить это исключение от других того же типа |
previous | Необязательный. Если это исключение было сгенерировано в блоке catch другого исключения, рекомендуется передать это исключение в этот параметр |
Методы
При перехвате исключения в следующей таблице показаны некоторые методы, которые можно использовать для получения информации об исключении:
Метод | Описание |
---|---|
getMessage() | Возвращает строку, описывающую, почему было сгенерировано исключение |
getPrevious() | Если это исключение было инициировано другим, этот метод возвращает предыдущее исключение. Если нет, то возвращается null |
getCode() | Возвращает код исключения |
getFile() | Возвращает полный путь к файлу, в котором возникло исключение |
getLine() | Возвращает номер строки кода, вызвавшего исключение |
Пример
Вывести информацию о сгенерированном исключении:
<?php
function divide($dividend, $divisor) {
if($divisor == 0)
{
throw new Exception("Деление на ноль", 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 исключений на нашем сайте W3Schools на русском.
Справочник содержит описания и примеры всех методов PHP исключений.