0 Tage Serie
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 main
import (
"errors"
"fmt"
)
type QueryError struct {
Query string
Err 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 *QueryError
if 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.