Direkt zum Hauptinhalt springen
eLearner.app
Modul 2 · Lektion 5 von 510/50 im Kurs~12 min
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:

Go
type error interface {
    Error() string
}

Jeder Typ, der Error() string implementiert, ist ein error.

Das grundlegende Muster

Go
v, err := operazione()
if err != nil {
    // gestisci o propaga
    return err
}
// usa v

Sie 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

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

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

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

Go
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

Übung#go.m2.l5.e1
Versuche: 0Wird geladen…

Behandeln Sie den Fehler von strconv.Atoi: if err != nil, print it and return; andernfalls drucken Sie n.

Editor wird geladen…
Hinweis anzeigen

Das kanonische Muster: `err != nil` prüfen, protokollieren/zurückgeben, dann `n` verwenden.

Lösung nach 3 Versuchen verfügbar

Übung#go.m2.l5.e2
Versuche: 0Wird geladen…

SafeDiv implementieren: if b == 0 return 0 and anerrors.New('divisione per zero'); sonst a/b und null.

Editor wird geladen…
Hinweis anzeigen

Überprüfen Sie `b == 0` VOR der Teilung, um eine Laufzeitpanik zu vermeiden.

Lösung nach 3 Versuchen verfügbar

Quiz#go.m2.l5.e3
Bereit

Welches ist das idiomatische Muster, um einen Fehler in Go zu behandeln?

Go
v, err := f()
// poi?
Antwortoptionen

Zusammenfassung

  • error ist eine Schnittstelle mit einer Methode Error() string.
  • Kanonisches Muster: v, err := f(); if err != nil { return err }.
  • Build-Fehler mit errors.New(msg) oder fmt.Errorf("ctx: %w", err).
  • Verwenden Sie %w zum Umwickeln und errors.Is / errors.As zur Inspektion der Kette.
  • panic nur für nicht behebbare Fehler, NICHT für normalen Kontrollfluss.