Tratamento de Erros em Go: try/catch e Além — Nível Avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Tratamento de Erros em Go: try/catch e Além — Nível Avançado

\n\n

Ao contrário de muitas linguagens modernas (Java, Python, JavaScript), Go não possui construções tradicionais como try/catch/finally. Desenvolvedores vindos de outros ecossistemas frequentemente veem isso como uma desvantagem. No entanto, a filosofia do Go oferece uma maneira mais explícita e previsível de lidar com erros. Neste artigo, exploraremos técnicas avançadas de tratamento de erros em Go: desde princípios básicos até a criação de sistemas flexíveis com panic/recover, encapsulamento de erros e tipos personalizados.

\n\n

1. Por que Go não tem try/catch?

\n\n

A principal razão é a simplicidade e legibilidade do código. Em Go, um erro é simplesmente um valor (error) que a função retorna como último resultado. O desenvolvedor verifica explicitamente esse valor, em vez de depender de um fluxo oculto de exceções. Isso torna o fluxo de execução do programa óbvio.

\n\n

O padrão típico é assim:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc readFile(name string) ([]byte, error) {\n    data, err := os.ReadFile(name)\n    if err != nil {\n        return nil, fmt.Errorf("não foi possível ler o arquivo %s: %w", name, err)\n    }\n    return data, nil\n}\n\nfunc main() {\n    data, err := readFile("config.json")\n    if err != nil {\n        fmt.Println("Erro:", err)\n        return\n    }\n    fmt.Println("Dados:", string(data))\n}
\n\n

Aqui, cada erro potencial é tratado explicitamente. Isso não é "ruído", mas sim uma garantia de que o programador considerou a possível falha.

\n\n

2. Técnicas Avançadas: Encapsulamento e Cadeias de Erros

\n\n

Go 1.13 introduziu suporte para encapsulamento de erros através de %w em fmt.Errorf. Isso permite criar cadeias de erros, preservando a causa original. Para desempacotar essas cadeias, são usadas as funções errors.Is e errors.As.

\n\n

Exemplo de encapsulamento e verificação:

\n\n
package main\n\nimport (\n    "errors"\n    "fmt"\n)\n\nvar ErrNotFound = errors.New("registro não encontrado")\n\nfunc findUser(id int) (string, error) {\n    if id != 42 {\n        return "", fmt.Errorf("busca pelo usuário %d: %w", id, ErrNotFound)\n    }\n    return "Alice", nil\n}\n\nfunc main() {\n    _, err := findUser(100)\n    if errors.Is(err, ErrNotFound) {\n        fmt.Println("Erro: registro ausente. Detalhes:", err)\n    } else {\n        fmt.Println("Erro desconhecido:", err)\n    }\n}
\n\n

Uso de errors.As para erros tipados:

\n\n
package main\n\nimport (\n    "errors"\n    "fmt"\n)\n\ntype ValidationError struct {\n    Field string\n    Msg   string\n}\n\nfunc (e *ValidationError) Error() string {\n    return fmt.Sprintf("erro de validação do campo %s: %s", e.Field, e.Msg)\n}\n\nfunc validateAge(age int) error {\n    if age < 0 {\n        return &ValidationError{Field: "age", Msg: "idade não pode ser negativa"}\n    }\n    return nil\n}\n\nfunc main() {\n    err := validateAge(-5)\n    var ve *ValidationError\n    if errors.As(err, &ve) {\n        fmt.Printf("Campo: %s, Mensagem: %s\\n", ve.Field, ve.Msg)\n    } else {\n        fmt.Println("Erro desconhecido:", err)\n    }\n}
\n\n

3. Panic e Recover: Recuperação de Emergência

\n\n

Embora panic em Go seja um análogo de exceção, ele deve ser usado apenas para situações truly exceptional (por exemplo, erro lógico do programador, divisão por zero, acesso fora dos limites de um array). recover permite capturar o pânico e retomar a execução.

\n\n

Importante: recover funciona apenas dentro de uma função adiada (defer). Um cenário típico é um middleware em um servidor HTTP ou a proteção de uma goroutine.

\n\n

Exemplo de execução segura de uma goroutine:

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\nfunc safeGoroutine(fn func()) {\n    go func() {\n        \n                

Blogs

Book Recommendations