Melhores Práticas de Tratamento de Erros
Estratégia de erro consistente entre bibliotecas vs. aplicações.
Busque em todas as páginas da documentação
Estratégia de erro consistente entre bibliotecas vs. aplicações.
As equipes Go enviam mais rápido quando cada pacote concorda sobre como os erros são criados, encapsulados, inspecionados, registrados e expostos aos clientes.
Estas regras transformam os artigos sobre tratamento de erros nesta seção em hábitos revisáveis para bibliotecas, serviços e CLIs.
error.error. Erros ignorados são bugs; use linters (errcheck) em CI.(zero, err) em caso de falha; nunca use o valor de sucesso quando err != nil. Os chamadores dependem desse invariante.errors.Is e errors.As em vez de == e correspondência de strings. Sobrevive a cadeias de encapsulamento e mudanças de texto.fmt.Errorf("operação: %w", err) para adicionar contexto. Um encapsulamento por camada com nomes de operação significativos.nil error em caso de sucesso, não ponteiros nil tipados. Evita surpresas com err != nil em caminhos de sucesso.registram e retornam o mesmo erro. Evite ruído de log duplicado, a menos que adicione contexto único indisponível a montante.error para que os chamadores controlem o comportamento de saída.%v em vez de %w em limites públicos quando as causas internas devem permanecer ocultas. Troca de segurança e abstração.problem, código gRPC), não texto bruto de Error(). Clientes ramificam em códigos.context.DeadlineExceeded para respostas de timeout (504/408, gRPC deadline exceeded). Dinstinga timeouts de "não encontrado".Retryable() bool ou código gRPC documentado.errors.Join quando todos os campos importam. Resposta única listando cada falha.err compartilhadas de goroutines sem sincronização. Use canais ou errgroup.errgroup.WithContext. Economiza cotas e CPU.context.Context e encapsule ctx.Err() com %w. Chamadores distinguem cancelamento de falha de I/O.debug.Stack em diagnósticos de aplicação, não em bibliotecas reutilizáveis. Stacks são para operadores.errors.Is, errors.As e status HTTP/gRPC mapeados. Testes apenas de caminhos de sucesso perdem regressões.ErrX em PascalCase. Corresponde às convenções da biblioteca padrão.Error() concisas e estáveis em significado. A lógica do programa usa campos e Is/As, não substrings.Não. Registre em limites ou quando adicionar contexto de diagnóstico único. Caso contrário, retorne erros encapsulados a montante.
Quando o erro já contém contexto suficiente para o próximo chamador, ou quando se usa %v para ocultar intencionalmente a cadeia.
O mínimo possível para o contrato documentado. Prefira estender códigos em um tipo em vez de adicionar muitos sentinels.
Sim. Mapeie resultados de errors.Is para exit 1/2/etc. e imprima mensagens amigáveis ao usuário no stderr.
Raramente para saída de CLI voltada ao usuário. Nunca para lógica de biblioteca; use Is/As.
Pacotes de domínio compartilhados permanecem agnósticos ao transporte; cada binário (API, worker, CLI) é responsável pela política de mapeamento e registro.
Prefira o encapsulamento padrão %w, errors.Is e errors.As em código novo. Stacks legados podem ser gradualmente atualizados.
Habilite errcheck, errorlint e wrapcheck (política da equipe) em golangci-lint para estilo consistente de encapsulamento e comparação.
Documentação OpenAPI/gRPC listando códigos e status estáveis; nunca documente strings de driver internas.
Quando você precisa que todas as falhas sejam coletadas, não que falhe rapidamente. Validação e linting em lote são casos comuns.
Afirme errors.Is/As e campos. A igualdade de string falha quando as mensagens ganham encapsulamentos de contexto.
Ao adicionar transportes (gRPC, GraphQL), alterar autenticação ou após incidentes causados por mapeamento de status ambíguo.
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026