O pacote @anthropic-ai/sdk lança uma subclasse de erro distinta para cada status HTTP que a API de Mensagens pode retornar, permitindo que você escreva blocos catch tipados em vez de analisar códigos de status manualmente. Esta referência compara cada classe de erro e mostra uma cadeia de catch funcional do mais específico para o menos específico.
Consulte a tabela abaixo para encontrar a classe de erro para um determinado status HTTP ou sintoma.
Use a coluna "Retentável" para decidir se deve permitir que a retentativa integrada do SDK a trate ou exibi-la imediatamente.
Copie o exemplo da cadeia catch e adapte os ramos de que você realmente precisa; a maioria dos aplicativos não precisa de todos eles.
Mantenha instanceof Anthropic.APIConnectionError ordenado antes de instanceof Anthropic.APIError em qualquer cadeia que você escrever, pois o primeiro é uma subclasse do último.
Anthropic.APIConnectionError é uma subclasse de Anthropic.APIError no SDK TypeScript, ao contrário do Python, onde APIConnectionError é uma classe irmã. Isso significa que uma verificação instanceof Anthropic.APIError também corresponderá a um erro de conexão. Sempre verifique APIConnectionError (e qualquer outra subclasse específica) antes da verificação genérica APIError em uma cadeia if/else if, ou o ramo específico nunca será executado.
import Anthropic from "@anthropic-ai/sdk";const client = new Anthropic();async function askClaude(prompt: string) { try { return await client.messages.create({ model: "claude-sonnet-5", max_tokens: 1024, messages: [{ role: "user", content: prompt }], }); } catch (error) { if (error instanceof Anthropic.RateLimitError) { // Retentável: o SDK já retentou internamente (maxRetries padrão: 2). // Se ainda falhou, espere mais ou enfileire a requisição. console.error(`Limite de taxa excedido (tipo: ${error.type}). Tente novamente mais tarde.`); } else if (error instanceof Anthropic.AuthenticationError) { // Não retentável: corrija a chave de API, não retente. console.error(`Falha na autenticação (tipo: ${error.type}). Verifique ANTHROPIC_API_KEY.`); } else if (error instanceof Anthropic.BadRequestError) { // Não retentável: corrija o payload da requisição. console.error(`Requisição inválida (tipo: ${error.type}): ${error.message}`); } else if (error instanceof Anthropic.InternalServerError) { // Retentável: falha transitória no lado do servidor. console.error(`Erro no servidor (tipo: ${error.type}). Seguro para retentar.`); } else if (error instanceof Anthropic.APIConnectionError) { // Retentável: verifique isso ANTES da verificação base APIError abaixo, // pois APIConnectionError é uma subclasse de APIError. console.error("Erro de rede, nenhuma resposta foi recebida."); } else if (error instanceof Anthropic.APIError) { // Captura genérica para qualquer outro erro de API tipado (status, type disponíveis). console.error(`Erro de API ${error.status} (tipo: ${error.type}): ${error.message}`); } else { // Não é um erro do SDK (um bug no código de chamada, por exemplo). throw error; } }}
Todo erro do SDK também expõe uma propriedade .type com a string do tipo de erro da API, que fornece uma classificação mais granular do que apenas o código de status HTTP. Dois erros podem compartilhar um status, mas ter um .type diferente:
try { await client.messages.create({ /* ... */ });} catch (error) { if (error instanceof Anthropic.APIError) { switch (error.type) { case "invalid_request_error": // mapeia para BadRequestError (400) break; case "authentication_error": // mapeia para AuthenticationError (401) break; case "rate_limit_error": // mapeia para RateLimitError (429) break; case "overloaded_error": // pode chegar como 429 ou 5xx dependendo da causa break; } }}
Por que APIConnectionError precisa ser verificado antes de APIError?
Porque no SDK TypeScript, APIConnectionError é uma subclasse de APIError, não uma classe irmã. Uma verificação instanceof Anthropic.APIError também corresponde a erros de conexão, portanto, se essa verificação vier primeiro em uma cadeia if/else if, o ramo mais específico APIConnectionError nunca será executado.
Isso é a mesma hierarquia do SDK Python?
Não. No SDK Python, APIConnectionError é uma classe irmã de APIError, não uma subclasse. Código portado do Python para TypeScript que assume a mesma relação pulará silenciosamente o ramo de erro de conexão.
Preciso retentar manualmente RateLimitError ou InternalServerError?
Geralmente não. O SDK já retenta automaticamente erros 429, 5xx e de conexão com backoff exponencial, usando um maxRetries padrão de 2. Adicione sua própria lógica de retentativa apenas se precisar de uma contagem de retentativas diferente, estratégia de backoff ou comportamento de enfileiramento.
Quais erros nunca devem ser retentados?
BadRequestError (400), AuthenticationError (401), PermissionDeniedError (403), NotFoundError (404) e UnprocessableEntityError (422). Retentar esses erros desperdiça uma requisição, pois o payload ou as credenciais, e não a rede ou a carga do servidor, causaram a falha.
O que a classe base APIError captura?
Qualquer erro de SDK tipado que não correspondeu a uma verificação instanceof mais específica anteriormente na cadeia, pois cada classe de erro específica estende APIError. Coloque-a por último em uma cadeia catch como uma rede de segurança, não como seu caminho de tratamento principal.
Como `.type` é diferente de `.status`?
.status é o código de status HTTP (um número, como 429). .type é a própria string de tipo de erro da API (como "rate_limit_error" ou "overloaded_error"), que permite distinguir causas que compartilham o mesmo código de status.
overloaded_error pode aparecer com um status diferente de 429?
Sim, overloaded_error pode chegar sob um status 429 ou 5xx dependendo da causa, que é exatamente o caso em que verificar .type além da classe mapeada por status fornece informações mais precisas.
O que aciona APIConnectionError especificamente?
Qualquer coisa que impeça uma resposta de chegar, como uma falha de DNS, uma conexão interrompida ou um tempo limite do lado do cliente. É distinto dos erros de código de status porque nenhuma resposta HTTP foi recebida.
Devo capturar erros por chamada ou com um wrapper compartilhado?
Para um aplicativo pequeno, uma função wrapper compartilhada (como askClaude acima) que centraliza a cadeia catch mantém o tratamento consistente. Para aplicativos maiores, envolva a cadeia catch em uma utilidade para que cada local de chamada obtenha a mesma classificação de retentável/não retentável sem duplicar a cadeia if/else if.
Jogar o erro de volta importa no último ramo else?
Sim. O else final no exemplo relança qualquer coisa que não seja um APIError do SDK, como um bug em seu próprio código de chamada. Engolir erros não-SDK silenciosamente torna bugs reais mais difíceis de encontrar.
UnprocessableEntityError é comum na prática?
Menos comum que BadRequestError, pois significa que a requisição era um JSON sintaticamente válido, mas falhou em uma verificação semântica, como um valor que é do tipo correto, mas fora de um intervalo permitido.
Qual nome de modelo devo usar no código de exemplo?
O exemplo usa claude-sonnet-5, o modelo padrão na linha atual de modelos Claude (Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5, Claude Haiku 4.5). Substitua pelo modelo que seu aplicativo tem como alvo.
Versões da Pilha: Escrito contra a linha de modelos Claude atual a partir de ~junho de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (o padrão), e Claude Haiku 4.5 - e o SDK oficial @anthropic-ai/sdk TypeScript (última versão). Nomes de modelos, versões de SDK e preços mudam rapidamente - verifique os detalhes atuais em platform.claude.com/docs antes de confiar neles.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026