Ответ вслух Junior Исключения и ошибки обновлено

Error и Exception в PHP 7+

Вопрос

Чем Error отличается от Exception в PHP и зачем это разделение?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

До PHP 7 фатальные ошибки просто убивали скрипт. В PHP 7 их сделали исключениями, но чтобы старый код с catch (Exception $e) не начал внезапно ловить ошибки программиста, ввели отдельную иерархию Error.

Что должно прозвучать в ответе

  • Оба реализуют Throwable

  • Error: ошибки движка и программиста (TypeError, DivisionByZeroError, вызов у null)

  • Exception: исключительные ситуации приложения, которые можно обработать

  • catch (Exception) не ловит Error, это сделано для обратной совместимости

  • catch (Throwable) только на верхнем уровне

Что могут спросить следом

  • Какие исключения бросает match без подходящей ветки?
  • Что такое ValueError?

Разбор

До PHP 7 фатальные ошибки просто убивали скрипт. В PHP 7 их сделали исключениями, но чтобы старый код с catch (Exception $e) не начал внезапно ловить ошибки программиста, ввели отдельную иерархию Error. Оба типа реализуют интерфейс Throwable.

Error сигнализирует о баге: TypeError при неверном типе аргумента, DivisionByZeroError, UnhandledMatchError от match без подходящей ветки, ValueError, когда аргумент правильного типа, но недопустимого значения, вызов метода у null. Обычно их не ловят, а исправляют код.

Exception это ситуации, которые приложение может ожидать и обработать: нет файла, отказал платёж, битый JSON. Свои исключения наследую от Exception или SPL-классов вроде RuntimeException. catch (Throwable) пишу только на самом верху, в глобальном обработчике, чтобы залогировать что угодно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.