go / expert
Snippet
Strukturierte Fehlerkontext-Extraktion über benutzerdefinierte Unwrap-Schnittstellen und errors.As
Gos errors.As durchläuft Fehlerketten rekursiv über Unwrap()-Methoden. Indem nach benutzerdefinierten Schnittstellen statt nach konkreten Struct-Zeigertypen gesucht wird, entkoppeln Aufrufer die Fehlerinspektionslogik von konkreten Implementierungen und extrahieren domänenspezifische Metadaten.
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
package mainimport ("errors""fmt")type CodedError interface {errorErrorCode() string}type DomainError struct {Code stringMessage stringErr error}func (e *DomainError) Error() string { return fmt.Sprintf("[%s] %s", e.Code, e.Message) }func (e *DomainError) ErrorCode() string { return e.Code }func (e *DomainError) Unwrap() error { return e.Err }func ExtractCode(err error) string {var coded CodedErrorif errors.As(err, &coded) {return coded.ErrorCode()}return "UNKNOWN_ERROR"}func main() {base := errors.New("connection timeout")wrapped := &DomainError{Code: "NET_504", Message: "Gateway Timeout", Err: base}fmt.Println("Extracted Error Code:", ExtractCode(wrapped))}
Erklärung
1
if errors.As(err, &coded) {
Durchsucht die Error-Unwrap-Kette nach einem Fehler im Baum, der den CodedError-Schnittstellenvertrag erfüllt.