go / intermediate
Snippet
Definieren benutzerdefinierter Fehlertypen und Verwendung von errors.As
Benutzerdefinierte Fehlertypen in Go ermöglichen das Mitführen von strukturiertem Kontext neben der Fehlermeldung. Durch die Implementierung der Unwrap-Methode lässt sich der benutzerdefinierte Fehler in die Standardbibliothek von Go integrieren, sodass errors.As den spezifischen benutzerdefinierten Fehlertyp von überall in der Aufrufkette abrufen kann.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package mainimport ("errors""fmt")type QueryError struct {Query stringErr error}func (e *QueryError) Error() string {return fmt.Sprintf("query %q failed: %v", e.Query, e.Err)}func (e *QueryError) Unwrap() error {return e.Err}func execute() error {return &QueryError{Query: "SELECT * FROM users",Err: errors.New("connection timeout"),}}func main() {err := execute()var qErr *QueryErrorif errors.As(err, &qErr) {fmt.Printf("Query failed: %s\n", qErr.Query)}}
Erklärung
1
type QueryError struct { ... }
Defines a custom struct to hold context, such as the query string and the underlying error.
2
func (e *QueryError) Error() string
Implementiert das integrierte error-Interface, indem eine formatierte Beschreibung des Fehlers zurückgegeben wird.
3
func (e *QueryError) Unwrap() error
Gibt den zugrunde liegenden verschachtelten Fehler frei und ermöglicht so die Inspektionsfunktionen der Standardbibliothek zum Ein- und Auspacken.
4
errors.As(err, &qErr)
Überprüft, ob ein Fehler in der Kette mit dem Zieltyp übereinstimmt, verpackt/entpackt ihn bei Bedarf und bindet ihn an qErr, falls eine Übereinstimmung gefunden wird.