Перейти к основному содержимому

Иерархия исключений в PHP

Разработчику Архитектору

Иерархия исключений в PHP

Интерактивное демо — часть сценариев на Python (try / except); в PHP — try / catch / finally, но стек вызовов и раскрутка те же. Подробнее: ошибки и исключения.

Play ITЗагрузка интерактивного демо…

Связь с теорией

Дерево Throwable — классификация сбоев для catch.

Прикладные паттерны — Обработка исключений в PHP; общие термины — ошибки и исключения.


Корневой интерфейс

  • Throwable — интерфейс, реализуемый всеми выбрасываемыми объектами.

Основные ветви

  1. Exception — базовый класс для всех исключений, генерируемых пользовательским или библиотечным кодом.
  2. Error — базовый класс для ошибок времени выполнения, которые ранее приводили к фатальному завершению (например, вызов несуществующей функции).

Оба класса реализуют Throwable.


1. Встроенные классы, наследующие Exception

Эти исключения обычно выбрасываются явно или через стандартную библиотеку.

  • LogicException — логические ошибки, которые можно предотвратить при разработке:

    • BadFunctionCallException
      • BadMethodCallException
    • DomainException
    • InvalidArgumentException
    • LengthException
    • OutOfRangeException
  • RuntimeException — ошибки, возникающие во время выполнения:

    • OutOfBoundsException
    • OverflowException
    • RangeException
    • UnderflowException
    • UnexpectedValueException
  • PDOException — выбрасывается расширением PDO при ошибках базы данных.

  • ErrorException — используется для преобразования ошибок PHP (через set_error_handler) в исключения.


2. Встроенные классы, наследующие Error

Эти ошибки заменили многие фатальные ошибки PHP 5 и теперь могут быть перехвачены.

  • ArithmeticError
    • DivisionByZeroError
  • AssertionError
  • CompileError
  • ParseError
  • TypeError
  • ValueError (введён в 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.