PHP - Исключения

Интерфейс Throwable

В PHP исключения являются объектами, представляющими exceptional условия. Они бросаются, когда в вашем коде occurs конкретная ошибка. PHP предоставляет интерфейс Throwable, который является базовым классом для всех исключений и ошибок. У него есть несколько методов, которые позволяют вам эффективно обрабатывать исключения.

PHP - Exceptions

Основы обработки исключений

Чтобы обработать исключения в PHP, вы можете использовать блок try-catch. Вот пример:

<?php
try {
// Код, который может бросить исключение
throw new Exception("Произошла ошибка!");
} catch (Exception $e) {
// Код для обработки исключения
echo "Перехвачено исключение: " . $e->getMessage();
}
?>

В этом примере мы используем оператор throw, чтобы создать новый объект Exception с пользовательским сообщением. Если исключение брошено внутри блока try, выполнение кода перейдет к соответствующему блоку catch, где исключение перехватывается и обрабатывается.

set_exception_handler

Функция set_exception_handler позволяет вам определить пользовательскую функцию, которая будет вызвана каждый раз, когда происходит не перехваченное исключение. Эта функция должна принимать два параметра: объект исключения и булево значение, указывающее, было ли исключение брошено во время вызова eval().

Вот пример использования set_exception_handler:

<?php
function myExceptionHandler($exception) {
echo "Не перехваченное исключение: " . $exception->getMessage();
}

set_exception_handler('myExceptionHandler');

// Код, который бросает исключение
throw new Exception("Ой! Произошла ошибка.");
?>

В этом примере мы определяем пользовательскую функцию обработки исключений под названием myExceptionHandler. Затем мы используем set_exception_handler, чтобы установить эту функцию в качестве стандартного обработчика исключений. Когда occurs не перехваченное исключение, наша пользовательская функция будет вызвана вместо стандартной.

Исключения SPL

PHP предоставляет несколько встроенных классов исключений в Стандартной библиотеке PHP (SPL). Эти классы наследуют класс Exception и предоставляют более конкретную информацию о различных типах исключений. Некоторые из распространенных исключений SPL включают:

  • BadFunctionCallException: Бросается, когда callback refers к неопределенной функции или если отсутствуют некоторые аргументы.
  • DomainException: Используется для ошибок в логике домена вашего приложения.
  • InvalidArgumentException: Вызывается, когда функция получает аргумент, который она не принимает.
  • LengthException: Используется, когда операция пытается использовать объект неправильной длины.
  • OutOfBoundsException: Бросается, когда индекс массива выходит за пределы.
  • OutOfRangeException: Вызывается, когда значение не находится в ожидаемом диапазоне.
  • RangeException: Используется, когда значение не находится в specified диапазоне.
  • RuntimeException: Общий例外 для runtime ошибок.
  • UnderflowException: Бросается при возникновении недоflows (например, вычитание из пустого стека).
  • UnexpectedValueException: Вызывается, когда значение не соответствует expected типу.

Вы можете использовать эти исключения SPL в вашем коде, как и любые другие классы исключений. Например:

<?php
function divide($a, $b) {
if ($b == 0) {
throw new DivisionByZeroError("Деление на ноль не допускается.");
}
return $a / $b;
}

try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "Перехвачено исключение: " . $e->getMessage();
}
?>

Пользовательские исключения

Кроме использования встроенных исключений SPL, вы можете также создавать свои собственные пользовательские классы исключений. Для этого просто расширите класс Exception и добавьте любую дополнительную функциональность, которая вам нужна. Вот пример:

<?php
class MyCustomException extends Exception {
public function __construct($message, $code = 0, Exception $previous = null) {
parent::__construct($message, $code, $previous);
}
}

try {
throw new MyCustomException("Это пользовательское исключение.");
} catch (MyCustomException $e) {
echo "Перехвачено пользовательское исключение: " . $e->getMessage();
}
?>

В этом примере мы создаем новый класс под названием MyCustomException, который наследует класс Exception. Затем мы бросаем и перехватываем экземпляр этого пользовательского исключения, как и любое другое исключение.

Следуя этим рекомендациям и используя предоставленные инструменты, вы можете эффективно обрабатывать исключения в вашем коде на PHP и обеспечить, чтобы ваши приложения были устойчивыми и resilient против непредвиденных ошибок. Помните всегда тщательно тестировать ваш код и обрабатывать исключения优雅но, чтобы предоставить лучший опыт пользователя.

Credits: Image by storyset