Lektionen des Moduls (5/5)
Fehler: das `if err != nil`-Muster
In Go sind Fehler Werte, keine Ausnahmen. Eine Funktion, die das kann fail gibt den Fehler als letzten Wert zurück und der Aufrufer überprüft ihn explizit. Es ist explizit, vorhersehbar, leicht zu testen – der Preis ist es etwas ausführlicher.
Die error-Schnittstelle
error ist eine kleine Schnittstelle, die in die Sprache integriert ist:
type error interface {
Error() string
}Jeder Typ, der Error() string implementiert, ist ein error.
Das grundlegende Muster
v, err := operazione()
if err != nil {
// gestisci o propaga
return err
}
// usa vSie werden es tausende Male sehen: Es ist der idiomatische Code für jeden fehlbarer Anruf. Fühlen Sie sich wegen der Wiederholung nicht schuldig – es ist ein Merkmal, nicht ein Fehler.
Fehler beim Erstellen: errors.New und fmt.Errorf
import (
"errors"
"fmt"
)
err1 := errors.New("file mancante")
err2 := fmt.Errorf("apertura %q fallita: permesso negato", path)fmt.Errorf ist perfekt, wenn Sie Variablen in die Nachricht einschließen möchten.
Umbruch mit %w
So verbreiten Sie einen Fehler beim Hinzufügen von Kontext, OHNE das Original zu verlieren:
f, err := os.Open(path)
if err != nil {
return fmt.Errorf("config: %w", err)
}%w „umschließt“ den ursprünglichen Fehler, der später mit behoben werden kann
errors.Is (Gleichheit für Sentinels) oder errors.As (für Betontyp):
if errors.Is(err, os.ErrNotExist) {
// file inesistente, gestione speciale
}Sentinel-Fehler
Dies sind als Variablen exportierte Fehler, die für Vergleiche mit errors.Is verwendet werden:
var ErrNotFound = errors.New("non trovato")
func find(id int) (Item, error) {
// ...
return Item{}, ErrNotFound
}
// chiamante:
if errors.Is(err, ErrNotFound) { ... }panic und recover (Vorschau)
panic existiert in Go, ist aber für nicht behebbare Fehler reserviert (z. B. Bugs,
verletzte Invarianten), nicht für den normalen Kontrollfluss. Wir werden tiefer einsteigen
das Funktionsmodul mit defer/recover. Vorerst: nicht an Ort und Stelle verwenden
des if err != nil-Musters.
Probieren Sie es aus
Behandeln Sie den Fehler von strconv.Atoi: if err != nil, print it and return; andernfalls drucken Sie n.
Hinweis anzeigen
Das kanonische Muster: `err != nil` prüfen, protokollieren/zurückgeben, dann `n` verwenden.
Lösung nach 3 Versuchen verfügbar
SafeDiv implementieren: if b == 0 return 0 and anerrors.New('divisione per zero'); sonst a/b und null.
Hinweis anzeigen
Überprüfen Sie `b == 0` VOR der Teilung, um eine Laufzeitpanik zu vermeiden.
Lösung nach 3 Versuchen verfügbar
Welches ist das idiomatische Muster, um einen Fehler in Go zu behandeln?
v, err := f()
// poi?Zusammenfassung
errorist eine Schnittstelle mit einer MethodeError() string.- Kanonisches Muster:
v, err := f(); if err != nil { return err }. - Build-Fehler mit
errors.New(msg)oderfmt.Errorf("ctx: %w", err). - Verwenden Sie
%wzum Umwickeln underrors.Is/errors.Aszur Inspektion der Kette. panicnur für nicht behebbare Fehler, NICHT für normalen Kontrollfluss.