PHP любит падать в самый неподходящий момент. И тут появляются исключения — объекты, которые сигналят: «Ты сделал что-то не так». Понимать иерархию этих зверюг — не для галочки, а чтобы не ловить ошибки как слепой кот по углам.

Иерархия исключений в PHP — это как семейное дерево, где каждый родственник несёт свой набор проблем. Игнорируешь это — завтра будешь ловить ошибки в проде и материться.

Базовые типы

  • Exception — это твой базовый “весёлый” родственник. Все твои самописные исключения от него наследуются.
  • Error — это когда PHP решает, что нужно кинуть тебя в пропасть. Типа Notice, Warning и всякая мелочь, которую большинство игнорирует, пока не сгорит сервер.

Если коротко: Exception для твоих ошибок, Error — для ошибок PHP, которые не попадают под Exception, но всё равно больно кусаются.

Дочерние классы Exception

PHP разложил ошибки по полочкам:

  • ErrorException — ловишь стандартные ошибки PHP как нормальные исключения.
  • TypeError — аргумент функции не того типа. Серьёзно, PHP, ну хоть один раз проверка была бы твоя.
  • ArgumentCountError — мало или много аргументов передал — улетаешь в исключение.
  • ArithmeticError — тут твоя математика обосралась, деление на ноль или ещё что.
  • DivisionByZeroError — строго про деление на ноль. Да, PHP отличает это от других арифметических ошибок, как будто это важно.
  • ParseError — синтаксис сломался. Самый быстрый способ увидеть красный экран.
  • ValueError — значение не вписывается в ожидаемый диапазон. Типа age = -5 — привет.

Да, иногда кажется, что PHP просто любит дублировать ошибки. TypeError повторяется дважды? Норм, значит PHP думает, что ты реально тупишь.

Дополнительные исключения

  • PDOException — если твои запросы к базе летят в тартарары.
  • SoapFault — SOAP снова решил сделать больно.
  • JsonException — JSON сломался, хотя ты думал, что просто сериализуешь массив.

Короче, если работаешь с внешними сервисами, база данных или API — готовься ловить исключения, иначе твой код будет падать без предупреждений.

Как пользоваться

Чтобы не лежать лицом в клавиатуре, используй try/catch.

try {
    // Код, который может выкинуть исключение
} catch (TypeError $e) {
    // Сразу ловим глупые ошибки типа неправильного аргумента
} catch (Exception $e) {
    // Всё остальное — общая сеть безопасности
}

Если хочешь быть аккуратным, можно несколько catch — каждая ошибка по своей полочке. Не делай один большой catch, иначе потеряешь контроль и будешь искать баги в темноте.

В итоге

  • Не игнорируй иерархию. Ловить всё через Exception — нормально для стартапа, но в серьёзном проекте это путь к хаосу.
  • Используй ErrorException, если хочешь, чтобы Notices и Warnings не превращались в тихие убийцы продакшена.
  • Обработка ошибок — это не для красоты. Это твоя страховка.

PHP исключения — это не просто классический try/catch, это твой инструмент выживания. Если понимаешь их иерархию, меньше шансов, что твой проект будет валиться на глупых вещах.