Benutzerdefinierte Fehler in Go: Eine praktische Anleitung
James Reed
Infrastructure Engineer · Leapcell

Key Takeaways
- Benutzerdefinierte Fehler in Go bieten im Vergleich zu einfachen Fehlern einen besseren Kontext und Typsicherheit.
- Struktur-basierte benutzerdefinierte Fehler ermöglichen umfangreichere Fehlermeldungen und strukturierte Daten wie Fehlercodes.
- Verwenden Sie
errors.Is
underrors.As
, um benutzerdefinierte Fehler sicher zu behandeln und zu identifizieren, insbesondere beim Umschließen von Fehlern.
Go (Golang) bietet eine einfache, aber leistungsstarke Möglichkeit zur Fehlerbehandlung, wobei der Schwerpunkt auf der expliziten Fehlerprüfung liegt. Während der eingebaute Typ error
für viele Szenarien ausreicht, erfordern komplexe Anwendungen oft benutzerdefinierte Fehler, um Klarheit, Kategorisierung und Debugging zu verbessern. In diesem Leitfaden werden wir untersuchen, wie man benutzerdefinierte Fehler in Go effektiv definiert, erstellt und verwendet.
Warum benutzerdefinierte Fehler verwenden?
Die Verwendung von benutzerdefinierten Fehlern bietet Ihnen:
- Kontext: Erklären Sie, was wo und warum schief gelaufen ist.
- Typsicherheit: Ermöglichen Sie es den Konsumenten Ihres Codes, bestimmte Fehlertypen zu erkennen.
- Besseres Debugging: Übertragen Sie strukturierte Informationen (z. B. Codes, Metadaten).
Einfacher benutzerdefinierter Fehler mit errors.New
Der einfachste Weg, einen benutzerdefinierten Fehler zu definieren, ist:
import "errors" var ErrUnauthorized = errors.New("unbefugter Zugriff")
Dies erzeugt einen Sentinel-Fehlerwert, der mit errors.Is
überprüft werden kann.
if err == ErrUnauthorized { // Handle unauthorized case }
Dieser Ansatz ist jedoch begrenzt – Sie können keinen dynamischen Kontext anhängen.
Struktur-basierte benutzerdefinierte Fehler
Um mehr Kontext einzubeziehen, definieren Sie Ihren eigenen Fehlertyp, indem Sie die error
-Schnittstelle implementieren:
type ValidationError struct { Field string Message string } func (e *ValidationError) Error() string { return "Validierung fehlgeschlagen bei '" + e.Field + "': " + e.Message }
Verwendung:
err := &ValidationError{ Field: "email", Message: "ungültiges Format", } fmt.Println(err) // Validierung fehlgeschlagen bei 'email': ungültiges Format
Sie können dann Typzusicherungen verwenden:
if vErr, ok := err.(*ValidationError); ok { fmt.Println("Feld:", vErr.Field) }
Verwenden von errors.As
und errors.Is
Beim Umschließen von Fehlern (z. B. mit fmt.Errorf
oder errors.Join
) können Sie weiterhin mit errors.As
oder errors.Is
nach bestimmten Fehlertypen suchen.
return fmt.Errorf("Verarbeitung fehlgeschlagen: %w", err)
Später:
if errors.As(err, &ValidationError{}) { // Handle validation error }
Oder:
if errors.Is(err, ErrUnauthorized) { // Handle known sentinel error }
Benutzerdefinierte Fehler mit Fehlercodes
Sie können benutzerdefinierte Fehlertypen entwerfen, die Fehlercodes oder -kategorien enthalten:
type AppError struct { Code int Message string } func (e *AppError) Error() string { return fmt.Sprintf("Code %d: %s", e.Code, e.Message) } const ( ErrCodeInvalidInput = 1001 ErrCodeNotFound = 1002 )
Dann:
return &AppError{ Code: ErrCodeInvalidInput, Message: "fehlendes Pflichtfeld", }
Und später:
if appErr, ok := err.(*AppError); ok && appErr.Code == ErrCodeNotFound { // Handle not found }
Wrapping mit Stack Traces (Optional)
Für fortgeschrittene Anwendungsfälle ermöglichen Bibliotheken wie pkg/errors oder Go 1.20’s errors.Join
das Beibehalten vollständiger Fehler-Stack-Traces und das Zusammensetzen mehrerer Fehler.
Best Practices
- Verwenden Sie Sentinel-Fehler (
var ErrSomething = errors.New(...)
), wenn die Fehlermeldung statisch ist und häufig wiederverwendet wird. - Definieren Sie struktur-basierte benutzerdefinierte Fehlertypen für die kontextbezogene oder typisierte Fehlerbehandlung.
- Umschließen und propagieren Sie Fehler immer mit
%w
, um eine weitere Introspektion zu ermöglichen. - Vermeiden Sie Zeichenfolgenvergleiche bei Fehlern; verwenden Sie
errors.Is
odererrors.As
.
Fazit
Die Go-Philosophie ermutigt dazu, Fehler als erstklassige Werte zu behandeln. Durch das Erstellen benutzerdefinierter Fehler können Sie wartbareren, debugfreundlicheren und robusteren Code schreiben. Egal, ob Sie APIs, Middleware oder große Anwendungen erstellen, benutzerdefinierte Fehler helfen, Absichten und Kontext klar über den gesamten Stack zu kommunizieren.
FAQs
Benutzerdefinierte Fehlertypen ermöglichen es Ihnen, strukturierte Daten zu übertragen und eine bessere Kontrolle über die Fehlerbehandlung zu bieten.
Verwenden Sie errors.As
, um den zugrunde liegenden Fehlertyp sicher zu extrahieren.
errors.Is
prüft einen bestimmten Fehlerwert; errors.As
extrahiert einen Fehler nach Typ.
Wir sind Leapcell, Ihre erste Wahl für das Hosten von Go-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Language Support
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 US-Dollar unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für verwertbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein operativer Overhead – konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ