capypad
0 Tage Serie
go / intermediate
Snippet

Error-Wrapping und Unwrapping

Go 1.13+ führte Error-Wrapping mittels des %w-Verbs in fmt.Errorf ein. Dies erlaubt es, Kontext zu einem Fehler hinzuzufügen, während man weiterhin mit errors.Is auf den ursprünglichen Sentinel-Error prüfen 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
package main
 
import (
"errors"
"fmt"
)
 
var ErrNotFound = errors.New("not found")
 
func fetchData() error {
return fmt.Errorf("database error: %w", ErrNotFound)
}
 
func main() {
err := fetchData()
if err != nil {
if errors.Is(err, ErrNotFound) {
fmt.Println("Resource was not found")
}
fmt.Println("Original error:", err)
fmt.Println("Unwrapped error:", errors.Unwrap(err))
}
}
Erklärung
1
fmt.Errorf("... %w", ErrNotFound)
Umschließt den ursprünglichen Fehler und bewahrt dessen Identität für spätere Prüfungen.
2
errors.Is(err, ErrNotFound)
Prüft rekursiv, ob ein Fehler in der Kette mit dem Ziel-Fehler übereinstimmt.
3
errors.Unwrap(err)
Gibt den zugrunde liegenden Fehler zurück, der eingepackt wurde.