Ошибки среды выполнения и поддержки
Область применения
Заголовок раздела «Область применения»Эти записи описывают исключения, генерируемые слоем поддержки среды выполнения: политикой деградации, транспортом HTTP на базе cURL, предохранителем отказоустойчивости, эмиттером Security Information and Event Management (SIEM), манифестом рендеринга, инспекцией PDF и подсистемой хаос-инженерии.
Каждое исключение NextPDF наследуется от NextPdfException, который реализует
ContextAwareExceptionInterface и предоставляет getContext(): array для
структурированного диагностического логирования. Подкласс заполняет этот массив только тогда, когда
переопределяет getContext(); базовый возвращает пустой массив. Три исключения на
этой странице (DegradedException, CircuitBreakerOpenException и InspectException) наследуются от PHP-класса
RuntimeException напрямую и раскрывают свои данные через публичные свойства readonly
вместо getContext(). Каждая запись ниже называет точные
свойства или ключи контекста, которые несёт класс, взятые из исходного кода.
Политика деградации
Заголовок раздела «Политика деградации»DegradedException
Заголовок раздела «DegradedException»- Генерируется, когда. Конвейер рендеринга встречает деградировавшую возможность,
которая нарушает активную политику деградации. Под
DegradationPolicy::Strictлюбая деградация высокого воздействия (ComplianceRisk,SemanticLossилиBlocking) генерирует его; подDegradationPolicy::Balancedего генерирует только воздействиеBlocking. - Класс. Наследуется напрямую от
RuntimeException(не отNextPdfException), поэтому он не несётgetContext(). - Несомые данные. Два публичных свойства
readonly:$capability( объект-значениеCapability, вызвавший отклонение, включая егоid,status,reason,fallbackTargetиimpact) и$policy( политикаDegradationPolicy, активная на момент отклонения). Сообщение имеет формуFeature "<id>" is <status>: <reason> (policy: <policy>). - Восстановление. Изучите
$capability, чтобы определить отсутствующую возможность и её причину. Либо установите компонент, который требует возможность, примите конфигурацию более низкого воздействия, либо ослабьте политику сStrictдоBalanced, когда деградация приемлема для сценария использования. Вызовите$capability->isAvailable()/isDegraded(), чтобы управлять сообщениями для пользователя.
Транспорт HTTP
Заголовок раздела «Транспорт HTTP»Эти три исключения происходят из клиента PSR-18 на базе cURL и его
декоратора с учётом безопасности. Первые два наследуются от NextPdfException, но не
переопределяют getContext(), поэтому их getContext() возвращает пустой массив;
диагностические данные достижимы через метод доступа PSR-18 getRequest() и
связанное предыдущее throwable.
CurlNetworkException
Заголовок раздела «CurlNetworkException»- Генерируется, когда. HTTP-запрос нельзя завершить из-за сбоя сетевого уровня: сбой разрешения Domain Name System (DNS), тайм-аут соединения или ошибка рукопожатия Transport Layer Security (TLS). Это также класс, который декоратор с учётом безопасности генерирует при отклонении по безопасности (отказ при Server-Side Request Forgery, отказ при DNS-rebinding или запрещённый редирект).
- Класс. Реализует PSR-18
Psr\Http\Client\NetworkExceptionInterface. - Несомые данные.
getRequest()возвращает сбойныйRequestInterface. Исходная ошибка транспорта, когда присутствует, является связанным предыдущим throwable.getContext()возвращает пустой массив (базовое значение по умолчанию). - Восстановление. Сетевой сбой может быть временным — повторите с откатом, если запрос идемпотентен. Отклонение по безопасности не является временным и должно завершиться отказом: не повторяйте; вместо этого исправьте целевой URL или политику SSRF. Прочтите сообщение и предыдущее throwable, чтобы различить эти два случая.
CurlRequestException
Заголовок раздела «CurlRequestException»- Генерируется, когда. Сам запрос нельзя отправить, потому что он некорректен, например недопустимый URL или запрос, не прошедший проверку SSRF до любого сетевого вызова.
- Класс. Реализует PSR-18
Psr\Http\Client\RequestExceptionInterface. - Несомые данные.
getRequest()возвращает проблемныйRequestInterface; базовая причина, когда присутствует, является связанным предыдущим throwable.getContext()возвращает пустой массив. - Восстановление. Это дефект ввода вызывающей стороны или политики, а не временный сбой. Не повторяйте без изменений. Исправьте URL запроса, заголовки или тело, или скорректируйте список разрешённых SSRF, если цель законно допустима, затем переотправьте запрос.
TransientHttpException
Заголовок раздела «TransientHttpException»- Генерируется, когда. Внутренне, внутри
SecurityAwareHttpClient, чтобы пометить действительно временный сбой внутреннего транспорта (DNS, соединение или тайм-аут, сгенерированные внутренним клиентом PSR-18) как пригодный для ограниченного бюджета повторов. Это единственный пригодный для повтора класс, который распознаёт цикл повторов декоратора; необёрнутое исключение (отклонение по безопасности, сгенерированное декоратором) считается фатальным. - Класс. Реализует PSR-18
Psr\Http\Client\NetworkExceptionInterface. Помечен@internal— он создаётся и разворачивается полностью внутриSecurityAwareHttpClientи никогда не покидает декоратор. - Несомые данные.
getRequest()возвращает сбойный запрос. ИсходноеClientExceptionInterfaceвнутреннего транспорта сохраняется как связанное предыдущее throwable (getPrevious()) и переподаётся дословно вызывающей стороне, как только бюджет повторов исчерпан, поэтому публичный контракт PSR-18 не изменяется.getContext()возвращает пустой массив. - Восстановление. Код приложения не перехватывает этот тип напрямую. Перехватывайте переподанное внутреннее исключение, которое декоратор возвращает после исчерпания бюджета повторов, и считайте повторяющиеся временные сбои проблемой доступности выше по потоку.
Отказоустойчивость
Заголовок раздела «Отказоустойчивость»CircuitBreakerOpenException
Заголовок раздела «CircuitBreakerOpenException»- Генерируется, когда.
CircuitBreakerв состоянииCircuitBreakerState::Openотклоняет вызов с быстрым отказом, до любого вызова ниже по потоку. Он существует, чтобы вызывающие стороны могли отличить «удалённая служба сейчас недоступна» ( временный сбой транспорта, который стоит деградировать) от «пул соединений был бы исчерпан этим вызовом» (быстрый отказ, сеть не задействована) — смягчение пакетного отказа в обслуживании (DoS), требуемое для клиентов Public Key Infrastructure (PKI). - Класс. Наследуется напрямую от
RuntimeException, поэтому он не несётgetContext(). - Несомые данные. Два публичных свойства
readonly:$breakerName( идентификатор открытого предохранителя) и$secondsUntilHalfOpen(приблизительное оставшееся время остывания до перехода предохранителя в полуоткрытое состояние). Сообщение имеет формуCircuit breaker "<name>" is OPEN (cooldown ~<n>s remaining); call rejected fail-fast. - Восстановление. Не долбите предохранитель — подождите как минимум
$secondsUntilHalfOpenперед повтором или деградируйте операцию. Сетевой вызов не предпринимался, поэтому это не свидетельство того, что сама удалённая служба дала сбой; это противодавление, защищающее пул соединений.
Наблюдаемость
Заголовок раздела «Наблюдаемость»SiemEmitterException
Заголовок раздела «SiemEmitterException»- Генерируется, когда. Эмиттер событий SIEM не может сохранить или связать запись. Он
выявляет сбои уровня файловой системы (
open,lock,seek,write,fflush,read) и сбои целостности хеш-цепочки (chain: индекс не по порядку, некорректная хвостовая запись или дрейф при JSON-обороте), общие для журнала событий хеш-цепочки и адаптеров эмиттера файла JSON-lines. - Класс. Наследуется от
NextPdfExceptionи переопределяетgetContext(). - Ключи контекста.
operation(один изopen,lock,seek,write,fflush,read,chain),path(целевой путь журнала) иdetail( читаемая человеком деталь, такая как число байтов или ожидаемый против фактического индекс). Они также достижимы черезgetOperation(),getPath()иgetDetail(). Сообщение имеет формуSIEM emitter <operation> failed for <path>: <detail>. - Восстановление. Это действенно для инфраструктуры или SecOps, а не для
логики приложения. Проверьте монтирование тома журнала, права доступа к каталогу,
доступные файловые дескрипторы и работоспособность файловой системы. Сбой операции
chainуказывает на сигнал подделки или повреждения в журнале аудита и должен быть расследован, а не молча повторён.
Манифест рендеринга
Заголовок раздела «Манифест рендеринга»RenderManifestException
Заголовок раздела «RenderManifestException»- Генерируется, когда.
RenderManifestнельзя сконструировать, десериализовать или прочитать из-за структурной ошибки, ошибки типа или совместимости схемы. Манифест — это версионированный публичный контракт, подаваемый каждым транспортом (CLI, очередь Laravel, Symfony, SaaS API), поэтому некорректный или несовместимый манифест выявляется напрямую, а не приводится к значениям по умолчанию. - Класс. Наследуется от
NextPdfExceptionи переопределяетgetContext(). Именованные конструкторы задают стабильный машиночитаемый код в пространстве имёнSPEC-MANIFEST-*:RenderManifestException::shape()→SPEC-MANIFEST-001— ошибка формы или типа во времяRenderManifest::fromArray().RenderManifestException::incompatibleVersion()→SPEC-MANIFEST-002— несовместимая мажорная версия схемы (нельзя прочитать).RenderManifestException::missingField()→SPEC-MANIFEST-003— обязательное поле отсутствует во время финализации построителя.RenderManifestException::unsupported()→SPEC-MANIFEST-004— корректно сформированный манифест ссылается на ввод или шаблон, который текущий рендерер не может разрешить (например ввод по URI или движок шаблонов только для хоста).
- Ключи контекста.
manifest_code(идентификаторSPEC-MANIFEST-*) иreason(читаемое человеком описание сбоя). Они также достижимы черезgetManifestCode()иgetReason(). Сообщение имеет форму[<code>] <reason>. - Восстановление. Ветвитесь по
manifest_code. ДляSPEC-MANIFEST-001иSPEC-MANIFEST-003исправьте полезную нагрузку манифеста (исправьте тип поля или предоставьте отсутствующее поле). ДляSPEC-MANIFEST-002перегенерируйте манифест против поддерживаемой мажорной версии схемы или обновите рендерер. ДляSPEC-MANIFEST-004предоставьте ввод или движок шаблонов, который текущая редакция может разрешить.
Инспекция
Заголовок раздела «Инспекция»InspectException
Заголовок раздела «InspectException»- Генерируется, когда. Инспекция PDF завершается сбоем.
- Класс. Наследуется напрямую от
RuntimeException(не отNextPdfException), поэтому он не несётgetContext(). - Несомые данные. Два публичных свойства
readonly:$inspectCode( машиночитаемый код в пространстве имёнINSPECT-*) и$retryable( булево значение, указывающее, должна ли вызывающая сторона повторить — например, когда сопроводитель инспекции временно недоступен). Исходная причина, когда присутствует, является связанным предыдущим throwable. - Восстановление. Ветвитесь по
$inspectCodeдля конкретного класса сбоя. Когда$retryableравноtrue, повторите с откатом, потому что сбой ожидаемо временный (например перезапуск сопроводителя); когдаfalse, считайте ввод или конфигурацию дефектом и не повторяйте без изменений.
Хаос-инженерия
Заголовок раздела «Хаос-инженерия»ChaosReportWriteException
Заголовок раздела «ChaosReportWriteException»- Генерируется, когда.
ChaosScenarioRunner::writeReport()не может сохранить агрегированный отчёт о дне хаоса на диск. Это типизированная по домену замена обобщённой ошибки среды выполнения, поэтому вызывающие стороны могут перехватить конкретный сбой записи отчёта на диск без смешивания его с ошибками, сгенерированными внутри самих симуляторов сценариев (раннер фиксирует их как поляChaosOutcome). - Класс. Наследуется от
NextPdfExceptionи переопределяетgetContext(). - Ключи контекста.
output_path(абсолютный путь, по которому раннер пытался записать). Он также достижим черезgetOutputPath(). Сообщение имеет формуChaosScenarioRunner: failed to write report to "<path>". - Восстановление. Это сбой на стороне записи приёмника отчёта, а не сценариев. Проверьте, что выходной каталог существует и доступен для записи и что место на диске доступно, затем повторно запустите запись отчёта. Сами результаты хаоса не затронуты.
RetrievalUnavailableException
Заголовок раздела «RetrievalUnavailableException»- Генерируется, когда. Конечная точка извлечения (например, служба Retrieval Augmented Generation Voyage) недоступна, и система либо откатывается к режиму только кеша, либо завершается отказом.
- Класс. Наследуется от
NextPdfExceptionи переопределяетgetContext(). - Ключи контекста.
mode(режим работы после сбоя —CACHED_ONLY, когда результаты обслуживаются только из семантического кеша, илиFAIL_CLOSED, когда запрос полностью отклонён без устаревших данных) иendpoint(конечная точка, ставшая недоступной). Они также достижимы черезgetMode()иgetEndpoint(). Сообщение имеет формуRetrieval endpoint "<endpoint>" is unavailable; operating in <mode> mode. - Восстановление. Прочтите
mode, чтобы узнать, как деградировала система. ПодCACHED_ONLYрезультаты могут быть устаревшими; обновите их, когда конечная точка восстановится. ПодFAIL_CLOSEDзапрос был отклонён по замыслу и должен быть повторён после того, как конечная точка станет доступной. Восстановите связность конечной точки (сеть, учётные данные, работоспособность службы) перед тем, как полагаться на свежее извлечение.