Erros de runtime e suporte
Estas entradas documentam as exceções geradas pela camada de suporte de runtime: a política de degradação, o transporte HTTP baseado em cURL, o circuit breaker de resiliência, o emissor de Security Information and Event Management (SIEM), o render manifest, a inspeção de PDF e o subsistema de chaos engineering.
Toda exceção do NextPDF estende NextPdfException, que implementa
ContextAwareExceptionInterface e expõe getContext(): array para
logging de diagnóstico estruturado. Uma subclasse preenche esse array somente quando
sobrescreve getContext(); a base retorna um array vazio. Três exceções
nesta página (DegradedException, CircuitBreakerOpenException e InspectException) estendem a
RuntimeException do PHP diretamente e expõem seus dados por meio de propriedades públicas readonly
em vez de getContext(). Cada entrada abaixo nomeia as
propriedades ou chaves de contexto exatas que a classe carrega, retiradas da origem.
Política de degradação
Seção intitulada “Política de degradação”DegradedException
Seção intitulada “DegradedException”- Gerada quando. O pipeline de renderização encontra uma capacidade degradada
que viola a política de degradação ativa. Sob
DegradationPolicy::Strict, qualquer degradação de alto impacto (ComplianceRisk,SemanticLossouBlocking) a gera; sobDegradationPolicy::Balanced, apenas um impactoBlockinga gera. - Classe. Estende
RuntimeExceptiondiretamente (nãoNextPdfException), então não carregagetContext(). - Dados carregados. Duas propriedades públicas
readonly:$capability(o objeto de valorCapabilityque disparou a rejeição, incluindo seuid,status,reason,fallbackTargeteimpact) e$policy(aDegradationPolicyativa no momento da rejeição). A mensagem tem a formaFeature "<id>" is <status>: <reason> (policy: <policy>). - Recuperação. Inspecione
$capabilitypara identificar o recurso ausente e sua causa. Instale o componente que a capacidade exige, aceite uma configuração de menor impacto, ou relaxe a política deStrictparaBalancedquando a degradação for aceitável para o caso de uso. Chame$capability->isAvailable()/isDegraded()para orientar mensagens voltadas ao usuário.
Transporte HTTP
Seção intitulada “Transporte HTTP”Estas três exceções se originam no cliente PSR-18 baseado em cURL e em seu
decorator com consciência de segurança. As duas primeiras estendem NextPdfException, mas não
sobrescrevem getContext(), então seu getContext() retorna um array vazio;
os dados de diagnóstico são alcançados pelo acessor getRequest() do PSR-18 e pelo
throwable anterior encadeado.
CurlNetworkException
Seção intitulada “CurlNetworkException”- Gerada quando. A requisição HTTP não pode ser concluída por causa de uma falha de nível de rede: falha de resolução do Domain Name System (DNS), timeout de conexão ou erro de handshake do Transport Layer Security (TLS). Ela também é a classe que o decorator com consciência de segurança gera para uma rejeição de segurança (recusa de Server-Side Request Forgery, recusa de DNS-rebinding ou um redirecionamento negado).
- Classe. Implementa o PSR-18
Psr\Http\Client\NetworkExceptionInterface. - Dados carregados.
getRequest()retorna oRequestInterfaceque falhou. O erro de transporte de origem, quando presente, é o throwable anterior encadeado.getContext()retorna um array vazio (o padrão base). - Recuperação. Uma falha de rede pode ser transitória — tente novamente com backoff se a requisição for idempotente. Uma rejeição de segurança não é transitória e deve falhar de forma fechada: não tente novamente; corrija a URL de destino ou a política de SSRF. Leia a mensagem e o throwable anterior para distinguir as duas.
CurlRequestException
Seção intitulada “CurlRequestException”- Gerada quando. A requisição em si não pode ser enviada porque está malformada, por exemplo uma URL inválida ou uma requisição que falhou na validação de SSRF antes de qualquer chamada de rede.
- Classe. Implementa o PSR-18
Psr\Http\Client\RequestExceptionInterface. - Dados carregados.
getRequest()retorna oRequestInterfaceproblemático; a causa subjacente, quando presente, é o throwable anterior encadeado.getContext()retorna um array vazio. - Recuperação. Este é um defeito de entrada do chamador ou de política, não uma falha transitória. Não tente novamente sem alterações. Corrija a URL, os headers ou o body da requisição, ou ajuste a allowlist de SSRF se o destino for legitimamente permitido, então reenvie a requisição.
TransientHttpException
Seção intitulada “TransientHttpException”- Gerada quando. Internamente, dentro de
SecurityAwareHttpClient, para marcar uma falha de transporte interno genuinamente transitória (DNS, conexão ou timeout gerada pelo cliente PSR-18 interno) como elegível para o orçamento de retry delimitado. É a única classe elegível para retry que o loop de retry do decorator reconhece; uma exceção não encapsulada (uma rejeição de segurança gerada pelo decorator) é tratada como fatal. - Classe. Implementa o PSR-18
Psr\Http\Client\NetworkExceptionInterface. Marcada como@internal— ela é criada e desencapsulada inteiramente dentro deSecurityAwareHttpCliente nunca escapa do decorator. - Dados carregados.
getRequest()retorna a requisição que falhou. AClientExceptionInterfacede transporte interno original é preservada como o throwable anterior encadeado (getPrevious()) e re-exposta de forma idêntica ao chamador assim que o orçamento de retry se esgota, para que o contrato público do PSR-18 fique inalterado.getContext()retorna um array vazio. - Recuperação. O código de aplicação não captura este tipo diretamente. Capture a exceção interna re-exposta que o decorator retorna após o orçamento de retry ser gasto, e trate falhas transitórias repetidas como um problema de disponibilidade upstream.
Resiliência
Seção intitulada “Resiliência”CircuitBreakerOpenException
Seção intitulada “CircuitBreakerOpenException”- Gerada quando. Um
CircuitBreakerno estadoCircuitBreakerState::Openrejeita uma chamada de forma fail-fast, antes de qualquer invocação downstream. Existe para permitir que os chamadores distingam “o serviço remoto está inacessível agora” (uma falha de transporte transitória, que vale a pena degradar) de “o pool de conexões teria sido esgotado por esta chamada” (fail-fast, nenhuma rede tentada) — a mitigação de negação de serviço em lote exigida para clientes de Public Key Infrastructure (PKI). - Classe. Estende
RuntimeExceptiondiretamente, então não carregagetContext(). - Dados carregados. Duas propriedades públicas
readonly:$breakerName(o identificador do breaker aberto) e$secondsUntilHalfOpen(o cooldown aproximado restante antes que o breaker faça a transição para half-open). A mensagem tem a formaCircuit breaker "<name>" is OPEN (cooldown ~<n>s remaining); call rejected fail-fast. - Recuperação. Não martele o breaker — aguarde pelo menos
$secondsUntilHalfOpenantes de tentar novamente, ou degrade a operação. Nenhuma chamada de rede foi tentada, então isto não é evidência de que o serviço remoto em si falhou; é back-pressure protegendo o pool de conexões.
Observabilidade
Seção intitulada “Observabilidade”SiemEmitterException
Seção intitulada “SiemEmitterException”- Gerada quando. Um emissor de eventos SIEM não consegue persistir ou encadear um registro. Ela
expõe falhas de nível de sistema de arquivos (
open,lock,seek,write,fflush,read) e falhas de integridade de hash-chain (chain: índice fora de ordem, registro de cauda malformado ou deriva de round-trip JSON) compartilhadas pelo log de eventos de hash-chain e pelos adaptadores de emissor de arquivo JSON-lines. - Classe. Estende
NextPdfExceptione sobrescrevegetContext(). - Chaves de contexto.
operation(um deopen,lock,seek,write,fflush,read,chain),path(o caminho de log de destino) edetail(um detalhe legível por humanos, como contagens de bytes ou índice esperado versus real). Estes também são alcançáveis por meio degetOperation(),getPath()egetDetail(). A mensagem tem a formaSIEM emitter <operation> failed for <path>: <detail>. - Recuperação. Isto é acionável por infraestrutura ou SecOps, não pela
lógica de aplicação. Verifique o mount do volume de log, as permissões de diretório, os
descritores de arquivo disponíveis e a saúde do sistema de arquivos. Uma falha de operação
chainindica um sinal de adulteração ou corrupção no log de auditoria e deve ser investigada, não silenciosamente repetida.
Render manifest
Seção intitulada “Render manifest”RenderManifestException
Seção intitulada “RenderManifestException”- Gerada quando. Um
RenderManifestnão pode ser construído, desserializado ou lido por causa de um erro estrutural, de tipo ou de compatibilidade de schema. O manifest é um contrato público versionado submetido por cada transporte (CLI, fila Laravel, Symfony, a API SaaS), então um manifest malformado ou incompatível é exposto diretamente em vez de ser coagido para os padrões. - Classe. Estende
NextPdfExceptione sobrescrevegetContext(). Construtores nomeados definem um código estável e legível por máquina no namespaceSPEC-MANIFEST-*:RenderManifestException::shape()→SPEC-MANIFEST-001— erro de formato ou de tipo duranteRenderManifest::fromArray().RenderManifestException::incompatibleVersion()→SPEC-MANIFEST-002— versão de schema major incompatível (não pode ser lida).RenderManifestException::missingField()→SPEC-MANIFEST-003— campo obrigatório ausente durante a finalização do builder.RenderManifestException::unsupported()→SPEC-MANIFEST-004— um manifest bem formado referencia uma entrada ou template que o renderizador atual não consegue resolver (por exemplo uma entrada de URI ou um template engine apenas de host).
- Chaves de contexto.
manifest_code(o identificadorSPEC-MANIFEST-*) ereason(a descrição da falha legível por humanos). Estes também são alcançáveis por meio degetManifestCode()egetReason(). A mensagem tem a forma[<code>] <reason>. - Recuperação. Ramifique por
manifest_code. ParaSPEC-MANIFEST-001eSPEC-MANIFEST-003, corrija o payload do manifest (corrija o tipo do campo ou forneça o campo ausente). ParaSPEC-MANIFEST-002, regere o manifest contra uma versão de schema major suportada ou atualize o renderizador. ParaSPEC-MANIFEST-004, forneça uma entrada ou template engine que a edição atual consiga resolver.
Inspeção
Seção intitulada “Inspeção”InspectException
Seção intitulada “InspectException”- Gerada quando. A inspeção de PDF falha.
- Classe. Estende
RuntimeExceptiondiretamente (nãoNextPdfException), então não carregagetContext(). - Dados carregados. Duas propriedades públicas
readonly:$inspectCode(um código legível por máquina no namespaceINSPECT-*) e$retryable(um booleano que indica se o chamador deve tentar novamente — por exemplo quando um sidecar de inspeção está temporariamente fora do ar). A causa de origem, quando presente, é o throwable anterior encadeado. - Recuperação. Ramifique por
$inspectCodepara a classe de falha específica. Quando$retryablefortrue, tente novamente com backoff porque a falha é esperada como transitória (como o reinício de um sidecar); quandofalse, trate a entrada ou a configuração como o defeito e não tente novamente sem alterações.
Chaos engineering
Seção intitulada “Chaos engineering”ChaosReportWriteException
Seção intitulada “ChaosReportWriteException”- Gerada quando.
ChaosScenarioRunner::writeReport()não consegue persistir o relatório agregado de chaos-day em disco. É uma substituição tipada de domínio para um erro de runtime genérico, para que os chamadores possam capturar a falha específica de disco do relatório sem confundi-la com erros gerados dentro dos próprios simuladores de cenário (o runner os captura como camposChaosOutcome). - Classe. Estende
NextPdfExceptione sobrescrevegetContext(). - Chaves de contexto.
output_path(o caminho absoluto que o runner tentou gravar). Também é alcançável por meio degetOutputPath(). A mensagem tem a formaChaosScenarioRunner: failed to write report to "<path>". - Recuperação. Esta é uma falha do lado da gravação do sink do relatório, não dos cenários. Verifique se o diretório de saída existe e é gravável e se há espaço em disco disponível, então execute novamente a gravação do relatório. Os resultados de chaos em si não são afetados.
RetrievalUnavailableException
Seção intitulada “RetrievalUnavailableException”- Gerada quando. Um endpoint de recuperação (por exemplo um serviço de Voyage Retrieval Augmented Generation) está indisponível e o sistema recorre ao modo somente cache ou falha de forma fechada.
- Classe. Estende
NextPdfExceptione sobrescrevegetContext(). - Chaves de contexto.
mode(o modo de operação após a falha —CACHED_ONLYquando os resultados são servidos apenas do cache semântico, ouFAIL_CLOSEDquando a requisição é recusada inteiramente sem dados obsoletos) eendpoint(o endpoint que se tornou inacessível). Estes também são alcançáveis por meio degetMode()egetEndpoint(). A mensagem tem a formaRetrieval endpoint "<endpoint>" is unavailable; operating in <mode> mode. - Recuperação. Leia
modepara saber como o sistema degradou. SobCACHED_ONLY, os resultados podem estar obsoletos; atualize assim que o endpoint se recuperar. SobFAIL_CLOSED, a requisição foi recusada por design e deve ser repetida após o endpoint estar acessível. Restaure a conectividade do endpoint (rede, credenciais, saúde do serviço) antes de depender de recuperação atualizada.