Иерархия исключений в PHP
Иерархия исключений в PHP
Интерактивное демо — часть сценариев на Python (
try/except); в PHP —try/catch/finally, но стек вызовов и раскрутка те же. Подробнее: ошибки и исключения.
Play ITЗагрузка интерактивного демо…
Дерево Throwable — классификация сбоев для catch.
Прикладные паттерны — Обработка исключений в 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
}
Разбор:
-
tryвыделяет участок, где может возникнуть ошибка времени выполнения. -
catch (Throwable $e)— самый широкий перехват в PHP, который покрывает и классические исключения, и ошибки движка. -
Объект
$eпередаёт контекст сбоя — сообщение, код, файл, строку и стек вызовов. -
Такой шаблон полезен на верхнем уровне приложения, чтобы не отдавать пользователю "сырой" фатал и централизованно логировать проблему.
-
Пользовательские исключения должны наследоваться от
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);
Разбор:
get_declared_classes()возвращает классы, которые уже загружены автозагрузчиком и расширениями в текущем процессе.array_filter(... is_subclass_of(..., 'Throwable'))отбирает только классы из иерархии ошибок и исключений.- Стрелочная функция
fn($c) => ...делает критерий фильтра коротким и локальным. sort($exceptions)стабилизирует порядок, чтобы вывод удобно сравнивать между запусками.print_r($exceptions)показывает итоговый список и помогает проверить, какие типы реально доступны в конкретном окружении.
Этот код выведет все загруженные классы, реализующие Throwable.
См. также
Практика try / catch / finally, throw и обработка на границе приложения — в статье Обработка исключений в прикладном коде PHP.