go / intermediate
Snippet
Abrufen von reichhaltigem Kontext über benutzerdefinierte Fehler-Structs und Entpacken
In Go können Fehler andere Fehler umhüllen, um kontextuelle Informationen bereitzustellen, während der ursprüngliche Fehlertyp erhalten bleibt. Durch die Implementierung der Unwrap() error-Methode auf einem benutzerdefinierten Error-Struct ermöglichen Sie Funktionen wie errors.Is und errors.As, die Fehlerkette zu inspizieren. Dies ermöglicht eine entkoppelte Fehlerbehandlung, bei der Aufrufer tiefe Fehler untersuchen können, ohne fest an den Wrapper gebunden zu sein.
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
35
36
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 executeQuery(query string) error {return &QueryError{Query: query,Err: errors.New("connection timeout"),}}func main() {err := executeQuery("SELECT * FROM users")if err != nil {var qErr *QueryErrorif errors.As(err, &qErr) {fmt.Printf("Custom error caught! Query: %s\n", qErr.Query)}}}
Erklärung
1
type QueryError struct {
Deklariert ein benutzerdefiniertes Error-Struct, das Metadaten (die Abfrage) und den zugrunde liegenden Fehler enthält.
2
func (e *QueryError) Error() string {
Implementiert das error-Interface, sodass QueryError als Standard-Fehler in Go verwendet werden kann.
3
func (e *QueryError) Unwrap() error {
Gibt den verschachtelten Fehler zurück, wodurch die Fehlerketten-Helper der Standardbibliothek durchlaufen werden können.
4
if errors.As(err, &qErr) {
Prüft, ob ein Fehler in der Kette vom Typ QueryError ist, und weist ihn im Erfolgsfall qErr zu.