Salt la conținutul principal
Modulul 6 · Lecția 5 din 530/50 în curs~14 min
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ă.

Go
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ă

Go
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:

Go
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:

Go
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

Go
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

Go
v, err := op()
if err != nil {
    return fmt.Errorf("op fallita per %q: %w", id, err)
}

Idiomuri:

  • Bifați err != nil imediat, 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ă

Exercițiu#go.m6.l5.e1
Încercări: 0Se încarcă…

Implementați șirul Error() pe *ErrNotFound, astfel încât returnează „non găsit: <Key>”.

Se încarcă editorul...
Afișează indiciu

`fmt.Println(err)` apelează automat metoda Error() din structura dumneavoastră.

Soluție disponibilă după 3 încercări

Exercițiu#go.m6.l5.e2
Încercări: 0Se încarcă…

Utilizați erori.Este să verificați dacă err este egal cu sentinelul ErrVuoto.

Se încarcă editorul...
Afișează indiciu

`errors.Is(err, target)` este robust chiar și cu lanțuri de ambalare.

Soluție disponibilă după 3 încercări

Quiz#go.m6.l5.e3
Gata

Care este semnătura exactă a metodei de implementare a erorii?

Go
func (e *MyErr) ??? {}
Opțiuni de răspuns

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 / %s pentru a împacheta: utilizați ÎNTOTDEAUNA %w.