Lecții din modul (5/5)
Interfața de eroare
error în Go nu este un cuvânt cheie: este o interfață încorporată cu un
o singură metodă.
type error interface {
Error() string
}Orice lucru care are Error() string este un error. Combinat cu
convenția de a returna (T, error) din funcții, este
fundamentul gestionării erorilor în Go.
Erori santinelă
import "errors"
var ErrNotFound = errors.New("non trovato")
func find(key string) (string, error) {
// ...
return "", ErrNotFound
}O sentinel este o valoare exportată error pe care apelantul o poate
compara cu pentru a recunoaște un caz de eroare specific.
Erori personalizate (cu date)
Pentru a transporta context (de exemplu, cheia lipsă) definiți un tip:
type ErrNotFound struct {
Key string
}
func (e *ErrNotFound) Error() string {
return "non trovato: " + e.Key
}
func find(key string) (string, error) {
return "", &ErrNotFound{Key: key}
}erori.Is și erori.As (Go 1.13+)
Compararea cu == funcționează numai pentru santinelele „pure”. A fi robust
împotriva erorilor incluse, utilizați pachetul errors:
import "errors"
if errors.Is(err, ErrNotFound) {
// err IS ErrNotFound (even if wrapped)
}
var nfe *ErrNotFound
if errors.As(err, &nfe) {
// err IS (or wraps) an *ErrNotFound; nfe points to the concrete value
fmt.Println("chiave mancante:", nfe.Key)
}errors.Is(err, target): adevărat dacă ținta este undeva în lanțul de ambalare.errors.As(err, &target): atribuie țintei prima eroare din lanțul de tipul său.
Încheierea cu %w
if err := find("k"); err != nil {
return fmt.Errorf("operazione X: %w", err)
}%w (NU %s sau %v) creează o nouă eroare care încheie
original, păstrând lanțul navigabil prin errors.Is/As.
Model de manipulare
v, err := op()
if err != nil {
return fmt.Errorf("op fallita per %q: %w", id, err)
}Idiomuri:
- Bifați
err != nilimediat, fără „cale fericită timpurie”. - Adăugați context la fiecare nivel cu
fmt.Errorf("... : %w", err). - „În amonte” (lângă principal / handler), discriminați cu
errors.Is/As.
Încearcă
Implementați șirul Error() pe *ErrNotFound, astfel încât returnează „non găsit: <Key>”.
Afișează indiciu
`fmt.Println(err)` apelează automat metoda Error() din structura dumneavoastră.
Soluție disponibilă după 3 încercări
Utilizați erori.Este să verificați dacă err este egal cu sentinelul ErrVuoto.
Afișează indiciu
`errors.Is(err, target)` este robust chiar și cu lanțuri de ambalare.
Soluție disponibilă după 3 încercări
Care este semnătura exactă a metodei de implementare a erorii?
func (e *MyErr) ??? {}Recapitulare
error = interface { Error() string }, încorporat.- Santinele cu
errors.New("...")pentru cazuri cunoscute fără context. - Tipuri de erori personalizate cu câmpuri pentru a transporta context.
errors.Is(err, target): comparație robustă cu ambalarea.errors.As(err, &target): extragerea tipului de beton.fmt.Errorf("...: %w", err): ambalaj care păstrează lanțul.- Niciodată
%v/%spentru a împacheta: utilizați ÎNTOTDEAUNA%w.