В чем разница в работе исключений в PHP 5 и PHP 7?

«В чем разница в работе исключений в PHP 5 и PHP 7?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное изменение в PHP 7 — введение интерфейса Throwable, который стал базовым для всех бросаемых объектов. Это позволило создать отдельную иерархию Error для фатальных ошибок ядра (TypeError, ParseError, AssertionError и т.д.), которые в PHP 5 не могли быть перехвачены блоком try/catch.

Ключевые отличия:

  1. Иерархия исключений:

    • PHP 5: Все исключения наследуются от класса Exception.
    • PHP 7: Появился интерфейс Throwable. От него наследуются два основных класса: Exception (для исключений приложения) и Error (для фатальных ошибок ядра).
  2. Возможность перехвата ошибок: В PHP 7 критические ошибки, такие как передача аргумента неверного типа, теперь выбрасывают TypeError, который можно перехватить.

Пример на PHP 7:

// В PHP 5 это вызвало бы фатальную ошибку, прерывающую выполнение.
// В PHP 7 ошибка типа преобразована в исключение.
try {
    function sum(int $a, int $b): int {
        return $a + $b;
    }
    $result = sum("10", "20"); // TypeError: Argument 1 must be of type int
} catch (TypeError $e) {
    echo "Поймана ошибка типа: " . $e->getMessage();
    // Можно выполнить логирование или альтернативную логику
}
  1. Новые классы ошибок: В PHP 7 появились ArithmeticError (например, при целочисленном делении на ноль), DivisionByZeroError, AssertionError (при неудачном assert()).

Итог: PHP 7 унифицировал обработку ошибок и исключений через Throwable, сделав код более надежным, так как критические сценарии теперь можно обрабатывать корректно, а не полагаться на глобальные обработчики ошибок.