Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 4 из 20I. Среда выполнения100 минут

Глава 4. Ошибки как управляемый маршрут отказа

Надёжная программа различает ожидаемый плохой ввод, предметный отказ и дефект выполнения, а затем ровно один слой переводит причину в протокол.

После главы вы сможете
  • классифицировать отказы
  • не ловить Throwable без политики
  • развести сообщение и журнал

Три класса отказов Pulse

Повреждённая NDJSON-строка — ожидаемая ошибка входа: её можно отметить и продолжить по политике. Нарушение предметного правила, например отрицательная длительность события, получает отдельную причину. TypeError или исчерпание памяти указывают на дефект или аварийное состояние и не должны маскироваться как обычная строка импорта.

Эта классификация определяет повтор, продолжение и видимость. Один catch(Throwable) без решения превращает разные причины в одинаковый успех и уничтожает сигнал мониторинга.

Маршрут исключения

Перевод причины в протоколИсключение ловится на границе, где известен протокол и возможен осмысленный исход.Causedomain/runtimeBoundarycatchLogcontextProtocolstatus/exitCallerdecision
Исключение ловится на границе, где известен протокол и возможен осмысленный исход.

Error и Exception

Оба реализуют Throwable, но происхождение и возможность восстановления различаются. ValueError может возникнуть при некорректном значении встроенной функции, TypeError — при несовместимом типе, а пользовательское исключение описывает правило приложения. Иерархия catch идёт от конкретного к общему.

Не перехватывайте исключение только ради немедленного throw того же объекта и повторного лога. Один владеющий boundary добавляет correlation id и безопасный контекст; верхний процесс сообщает финальный status или exit code.

Error handler и shutdown

set_error_handler способен преобразовать выбранные PHP warning в ErrorException, но handler уважает текущий error_reporting и не получает все фатальные ситуации. register_shutdown_function может увидеть последнюю ошибку через error_get_last, однако в аварийном состоянии доступные ресурсы ограничены.

Shutdown не является транзакцией и не гарантирует доставку сложного сетевого отчёта. Его задача — минимальная запись заранее подготовленным каналом. Долговечность данных обеспечивается до опасной операции, а не финальным callback.

Что изменилось в 8.5

PHP 8.5 добавил функции чтения текущих обработчиков и backtrace для ряда фатальных ошибок. Это помогает диагностике, но не делает display_errors безопасным для посетителя. Новые возможности проверяются по migration guide и тестируются на фактической версии runtime.

Pulse сохраняет идентификатор пакета, номер строки и класс причины. Полное содержимое события в журнал не попадает: оно может содержать персональные данные или секреты.

Лаборатория

Создайте четыре сценария: повреждённый JSON, недопустимое значение, TypeError и исключение хранилища. Зафиксируйте, продолжает ли импорт работу, что видит оператор и какой код получает вызывающий процесс.

  • Одна причина журналируется один раз.
  • STDOUT не загрязнён stack trace.
  • Пользовательский ответ не раскрывает путь файла.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Где ловить исключение для перевода в HTTP status?
2. Гарантирует ли shutdown доставку сложного сетевого отчёта?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/manual/en/language.errors.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie