5.07. Иерархия исключений в PHP
Иерархия исключений в PHP
Корневой интерфейс:
Throwable— интерфейс, реализуемый всеми выбрасываемыми объектами.
Основные ветви:
Exception— базовый класс для всех исключений, генерируемых пользовательским или библиотечным кодом.Error— базовый класс для ошибок времени выполнения, которые ранее приводили к фатальному завершению (например, вызов несуществующей функции).
Оба класса реализуют Throwable.
1. Встроенные классы, наследующие Exception
Эти исключения обычно выбрасываются явно или через стандартную библиотеку.
-
LogicException— логические ошибки, которые можно предотвратить при разработке:BadFunctionCallExceptionBadMethodCallException
DomainExceptionInvalidArgumentExceptionLengthExceptionOutOfRangeException
-
RuntimeException— ошибки, возникающие во время выполнения:OutOfBoundsExceptionOverflowExceptionRangeExceptionUnderflowExceptionUnexpectedValueException
-
PDOException— выбрасывается расширением PDO при ошибках базы данных. -
ErrorException— используется для преобразования ошибок PHP (черезset_error_handler) в исключения.
2. Встроенные классы, наследующие Error
Эти ошибки заменили многие фатальные ошибки PHP 5 и теперь могут быть перехвачены.
ArithmeticErrorDivisionByZeroError
AssertionErrorCompileErrorParseErrorTypeErrorValueError(введён в PHP 8.0)UninitializedPropertyError(введён в PHP 8.2, при доступе к непроинициализированному свойству)FiberError(введён в PHP 8.1, при некорректном использовании Fiber)
3. Другие важные исключения из стандартной библиотеки
JsonException— выбрасывается функциямиjson_encode()/json_decode()приJSON_THROW_ON_ERROR.DOMException— из расширения DOM.ReflectionException— из расширения Reflection.PharException— при работе с архивами Phar.SoapFault— из расширения SOAP.
Эти исключения наследуются от
Exception.
Особенности модели исключений в PHP:
- Начиная с PHP 7, большинство фатальных ошибок (например, вызов несуществующей функции, несовпадение типов) выбрасывают экземпляры
Error, а не завершают скрипт немедленно. ErrorиExceptionне наследуют друг друга, но оба реализуютThrowable. Поэтому для перехвата всех выбрасываемых объектов следует использовать:try {
// ...
} catch (Throwable $e) {
// обработка и Error, и Exception
}- Пользовательские исключения должны наследоваться от
Exception(или одного из его подклассов), а не отError. - Ошибки уровня
E_ERROR,E_PARSEи т.д. больше не прерывают выполнение, если они преобразованы вError(что происходит автоматически в PHP 7+).
Как получить список программно:
PHP не предоставляет встроенного способа перечислить все встроенные исключения, но можно использовать рефлексию:
$classes = get_declared_classes();
$exceptions = array_filter($classes, fn($c) => is_subclass_of($c, 'Throwable'));
sort($exceptions);
print_r($exceptions);
Этот код выведет все загруженные классы, реализующие Throwable.