Noções Básicas de Tratamento de Erros
10 exemplos para você começar com Tratamento de Erros - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com Tratamento de Erros - 7 básicos e 3 intermediários.
mkdir errdemo && cd errdemo && go mod init example.com/errdemo.main.go e execute com go run ..error e a verificação de nilTodo caminho de falha começa com a verificação do segundo valor de retorno.
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("missing.txt")
if err != nil {
fmt.Println("falha ao abrir:", err)
return
}
defer f.Close()
}(T, error); um error não-nil significa falha.err != nil, trate o resultado principal como inválido, a menos que documentado de outra forma.nil significa sucesso.Relacionado: Erros como Valores: A Filosofia de Erros do Go - por que o Go usa valores, não exceções
Propague falhas retornando error para o chamador.
package main
import (
"errors"
"fmt"
)
func parsePort(s string) (int, error) {
if s == "" {
return 0, errors.New("porta é obrigatória")
}
return 8080, nil // simplificado
}
func main() {
if _, err := parsePort(""); err != nil {
fmt.Println(err)
}
}errors.New para mensagens estáticas sem formatação.T junto com o erro.Relacionado: Erros Sentinela e errors.Is - variáveis de erro em nível de pacote
fmt.Errorf para erros formatadosAdicione detalhes dinâmicos quando a mensagem depende de valores.
package main
import (
"fmt"
)
func loadUser(id int) error {
if id < 1 {
return fmt.Errorf("id de usuário inválido %d", id)
}
return nil
}
func main() {
fmt.Println(loadUser(-1))
}fmt.Errorf é como fmt.Sprintf, mas retorna um error.%w ao envolver um erro existente (abordado nos exemplos intermediários).Relacionado: Envolvendo Erros com %w & errors.As -
%we cadeias de unwrap
Evite aninhamentos profundos retornando imediatamente após uma falha.
package main
import (
"fmt"
"os"
)
func readSize(path string) (int64, error) {
info, err := os.Stat(path)
if err != nil {
return 0, err
}
return info.Size(), nil
}
func main() {
size, err := readSize("go.mod")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("bytes:", size)
}err antes de usar o valor de sucesso.return zero, err dentro de funções auxiliares.if err == nil aninhados.errors.IsCompare erros estáveis em nível de pacote através de cadeias de envolvimento.
package main
import (
"errors"
"fmt"
"io"
"os"
)
func main() {
_, err := os.Open("nope.txt")
if errors.Is(err, os.ErrNotExist) {
fmt.Println("arquivo não encontrado")
return
}
if errors.Is(err, io.EOF) {
fmt.Println("EOF inesperado")
}
}errors.Is percorre cadeias de unwrap; err == os.ErrNotExist falha após o envolvimento.os.ErrNotExist e io.EOF.var ErrThing = errors.New("coisa").Relacionado: Erros Sentinela e errors.Is - regras de design de sentinelas
defer ainda é executado em caminhos de erroLimpe recursos mesmo quando você retorna antecipadamente.
package main
import (
"fmt"
"os"
)
func copyMeta(path string) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close()
// ler metadados...
return nil
}
func main() {
fmt.Println(copyMeta("go.mod"))
}defer f.Close() imediatamente após uma abertura bem-sucedida.defer antes de verificar err da operação que produziu f.Escolha uma ação principal por camada, a menos que esteja adicionando contexto distinto.
package main
import (
"fmt"
"log"
"os"
)
func main() {
data, err := os.ReadFile("config.yaml")
if err != nil {
log.Printf("ler configuração: %v", err)
return
}
fmt.Printf("carregado %d bytes\n", len(data))
}main ou handlers geralmente registram e saem ou respondem.Relacionado: Melhores Práticas de Tratamento de Erros - responsabilidades de bibliotecas vs. aplicações
%wPreserve a causa raiz enquanto adiciona contexto em cada camada.
package main
import (
"fmt"
"os"
)
func readConfig(path string) error {
_, err := os.ReadFile(path)
if err != nil {
return fmt.Errorf("ler configuração %q: %w", path, err)
}
return nil
}
func main() {
err := readConfig("missing.yaml")
fmt.Println(err)
fmt.Println(os.IsNotExist(err)) // true através da cadeia de envolvimento
}%w armazena o erro envolvido para errors.Is e errors.As.os.IsNotExist e errors.Is percorrem os envolvimentos.%v em vez de %w quando o erro interno não deve ser inspecionável.Relacionado: Envolvendo Erros com %w & errors.As - guia completo de envolvimento
errors.AsExtraia dados estruturados de um tipo de erro personalizado.
package main
import (
"errors"
"fmt"
)
type ValidationError struct {
Field string
}
func (e ValidationError) Error() string {
return "campo inválido: " + e.Field
}
func validate(name string) error {
if name == "" {
return ValidationError{Field: "name"}
}
return nil
}
func main() {
err := validate("")
var ve ValidationError
if errors.As(err, &ve) {
fmt.Println("campo:", ve.Field)
}
}errors.As atribui o primeiro tipo correspondente na cadeia de unwrap.&ve).Relacionado: Tipos de Erro Personalizados e Interfaces de Erro - projetando erros ricos
Mapeie erros de domínio para status HTTP na fronteira.
package main
import (
"errors"
"fmt"
)
var ErrNotFound = errors.New("não encontrado")
func getUser(id string) error {
if id == "" {
return ErrNotFound
}
return nil
}
func statusFor(err error) int {
switch {
case errors.Is(err, ErrNotFound):
return 404
case err != nil:
return 500
default:
return 200
}
}
func main() {
fmt.Println(statusFor(getUser(""))) // 404
fmt.Println(statusFor(getUser("1"))) // 200
}errors.Is para mapeamento de sentinelas; evite vazar strings de os ou do driver.Relacionado: Design de Erros de API para Serviços HTTP e gRPC - contratos de erro de serviço
Versões da Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, modernizadores go fix - 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: 19 de jul. de 2026