Go Erros Intermediário
Erros customizados
Em Go, erros são valores que implementam a interface error. Você pode criar erros customizados definindo tipos que implementam Error() string ou usando errors.New e fmt.Errorf. Isso permite transportar informações extras além da mensagem, como códigos de status ou campos específicos.
Erros sentinela são valores de erro pré-definidos (como io.EOF) usados para comparação com errors.Is. Já errors.Join combina múltiplos erros em um só, útil quando várias operações falham independentemente.
Escolha entre eles conforme a necessidade: use erros sentinela para condições simples e bem conhecidas; tipos customizados quando precisar de dados adicionais; e errors.Join para agregar falhas sem perder informações.
Pontos-chave
- Erros customizados são tipos que implementam a interface
errorcom o métodoError() string. - Erros sentinela são valores como
io.EOFe devem ser comparados comerrors.Is. errors.Joinagrega múltiplos erros em um único erro que pode ser desmembrado comerrors.Unwrap.- Use
fmt.Errorfcom%wpara envolver erros e preservar a cadeia paraerrors.Iseerrors.As. - Escolha o tipo de erro conforme a necessidade: sentinela para comparação simples, customizado para dados extras, Join para múltiplas falhas.
package main
import (
"errors"
"fmt"
)
// ValidationError é um erro customizado com campo extra.
type ValidationError struct {
Field string
Msg string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("campo %q: %s", e.Field, e.Msg)
}
// ErrNotFound é um erro sentinela.
var ErrNotFound = errors.New("recurso não encontrado")
func buscar(id int) error {
if id != 1 {
return fmt.Errorf("buscar id=%d: %w", id, ErrNotFound)
}
return nil
}
func validar(nome string) error {
if nome == "" {
return &ValidationError{Field: "nome", Msg: "não pode ser vazio"}
}
return nil
}
func main() {
// Erro customizado
err := validar("")
var ve *ValidationError
if errors.As(err, &ve) {
fmt.Println("Validação falhou no campo:", ve.Field)
}
// Erro sentinela com wrapping
err = buscar(2)
if errors.Is(err, ErrNotFound) {
fmt.Println("Não encontrado:", err)
}
// errors.Join
err1 := validar("")
err2 := buscar(3)
joined := errors.Join(err1, err2)
fmt.Println("Erros combinados:")
fmt.Println(joined)
}