Самоучитель: PHP 8.5: инженерный практикум
Глава 16 из 22IV. Объектный дизайн105 минут

Глава 16. Исключения, структурные логи и управляемое время

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

После главы вы сможете
  • классифицировать отказ
  • создать структурное событие
  • заменить глобальное время Clock

Ожидаемый отказ не равен дефекту

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

Не ловите Throwable вокруг каждой строки. Локальный catch нужен, когда код действительно добавляет контекст, выполняет компенсацию или переводит низкоуровневую ошибку в предметный тип.

Два направления ошибки

Обработка отказаОдин correlation id связывает безопасный ответ пользователя с внутренним событием и метрикой.ExceptionclassifiedResponsesafeEventstructuredMetriccountTracecorrelate
Один correlation id связывает безопасный ответ пользователя с внутренним событием и метрикой.

Структурное событие

Лог содержит event name, severity, timestamp, build id, correlation id и минимальные идентификаторы. Поле password, session id, CSRF token и содержимое Authorization удаляются до передачи logger.

Не собирайте предложение конкатенацией, если затем нужно искать по user_id и duration_ms. Структура делает агрегацию возможной, но не оправдывает запись персональных данных без цели и срока хранения.

Часы как зависимость

Вызов new DateTimeImmutable('now') внутри модели делает тест зависимым от текущей секунды. Интерфейс Clock из PSR-20 или собственный узкий контракт позволяет production использовать системное время, а тесту — фиксированное.

Передавайте временную точку один раз в сценарий. Несколько вызовов now способны пересечь границу дня и создать запись с несогласованными датами. База и PHP также должны договориться об UTC.

Не логируйте дважды

Нижний слой либо оборачивает исключение с причиной, либо даёт ему подняться. Финальная граница записывает событие один раз. Лог на каждом уровне создаёт три записи одной ошибки и искажает метрику.

Stack trace полезен оператору, но не пользователю. В production response содержит стабильный код и correlation id, а подробности защищены политикой доступа и сроком хранения.

Лабораторная работа

Опишите InvalidWorkout, AccessDenied, VersionConflict и StorageUnavailable. Сопоставьте их HTTP-статусам, уровням PSR-3 и метрикам; затем протестируйте публикацию с фиксированными часами.

Локальный прогресс

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

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

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

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

  • php-fig.orghttps://www.php-fig.org/psr/psr-3/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php-fig.orghttps://www.php-fig.org/psr/psr-20/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

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

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

Аналитика

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

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

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

Политики

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