0 Tage Serie
go / intermediate
Snippet

Implementieren benutzerdefinierter Fehlertypen mit Unwrap-Unterstützung

In Go können Fehler andere Fehler umhüllen, um Kontext zu liefern. Durch die Implementierung einer Unwrap()-Methode, die 'error' zurückgibt, ermöglicht ein benutzerdefinierter Fehlertyp Standardbibliotheksfunktionen wie errors.Is und errors.As, die Fehlerkette rekursiv zu untersuchen. Dies trennt den übergeordneten Kontextfehler von der zugrunde liegenden Ursache.

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
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 main() {
baseErr := errors.New("permission denied")
err := &QueryError{Query: "SELECT * FROM users", Err: baseErr}
if errors.Is(err, baseErr) {
fmt.Println("Underlying error is 'permission denied'")
}
}
Erklärung
1
type QueryError struct {
Definiert eine benutzerdefinierte Fehlerstruktur, die Kontextinformationen (Query) und den zugrunde liegenden Fehler (Err) enthält.
2
func (e *QueryError) Error() string {
Implementiert das error-Interface und formatiert die Fehlermeldung mit dem Kontext und dem inneren Fehler.
3
func (e *QueryError) Unwrap() error {
Gibt den eingepackten Fehler zurück, sodass die Standardbibliothek auf den verschachtelten Fehler zugreifen kann.
4
if errors.Is(err, baseErr) {
Verwendet errors.Is, um zu überprüfen, ob der Basisfehler an irgendeiner Stelle in der Fehlerkette vorhanden ist.