©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
In der Go-Programmierung ist die Fehlerbehandlung ein zentrales Thema, das jedoch oft zu subtilen Fehlern führen kann – insbesondere, wenn Entwickler:innen konkrete Fehlertypen anstelle des error-Interfaces verwenden. Dieser Artikel beleuchtet eine häufige Fehlerquelle und erklärt, warum der richtige Umgang mit Fehlern mehr als nur technisches Know-how erfordert.
Betrachten wir dieses Codebeispiel:
type myError struct{}
func (c *myError) Error() string {
return "Unexpected Error."
}
func run() ([]byte, *myError) {
return nil, nil
}
func main() {
var err error
if _, err = run(); err != nil {
log.Fatal("We are failed")
}
log.Println("Everything is OK")
}
Ausgabe:
We are failed
Warum passiert das?
Die Lösung:
✔️ Immer das error-Interface als Rückgabetyp verwenden:
func run() ([]byte, error) { ... }
-
Fehlerbehandlung umfasst drei Schlüsselprinzipien:
Ein häufiges Problem ist die unvollständige Weitergabe von Kontext. Wenn eine Funktion einen Fehler nicht selbst behandeln kann, muss sie ihn mit ausreichenden Metadaten an höhere Ebenen weiterreichen.
-
import "github.com/pkg/errors"
func first(i int) error {
if err := second(i); err != nil {
return errors.Wrapf(err, "secondCall(%d)", i)
}
return nil
}
func second(i int) error {
return &MainError{99}
}
Vorteile:
switch v := errors.Cause(err).(type) {
case *MainError:
fmt.Println("Custom Error:", v.State)
}
Ohne externe Pakete lässt sich ähnliche Funktionalität mit fmt.Errorf und %w erreichen:
return fmt.Errorf("secondCall(%d): %w", i, err)
Extrahieren des Ursprungsfehlers:
func Cause(err error) error {
root := err
for {
if err = errors.Unwrap(root); err == nil {
return root
}
root = err
}
}
-
-
Die Verwendung konkreter Fehlertypen statt des error-Interfaces ist ein klassischer Anfängerfehler in Go, der zu schwer auffindbaren Bugs führt. Durch das Wrappen von Fehlern und eine konsistente Fehlerstrategie lässt sich jedoch nicht nur Code-Robustheit erreichen, sondern auch die Wartbarkeit deutlich verbessern.
Merksatz:
"Handle errors like you’re debugging at 3 AM – provide enough context to make sense of them when you’re half asleep."
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten