Error Wrapping and Inspection
Errors Is
errors.Is checks whether a wrapped error chain contains a specific sentinel.
errors is
Use `errors.Is` when callers need to ask whether a known error occurred under extra context.
Errors Is
errors_is.go
Replay: real traced execution (multi-file project)
package main
import (
"errors"
"fmt"
)
var ErrMissing = errors.New("missing record")
func lookup(key string) error {
if key == "missing" {
return fmt.Errorf("lookup %s: %w", key, ErrMissing)
}
return nil
}
func main() {
var key = "missing"
err := lookup(key)
errText := "none"
if err != nil {
errText = err.Error()
}
isMissing := errors.Is(err, ErrMissing)
fmt.Println("key=", key)
fmt.Println("err=", errText)
fmt.Println("is_missing=", isMissing)
}
package main
import (
"errors"
"fmt"
)
var ErrMissing = errors.New("missing record")
func lookup(key string) error {
if key == "missing" {
return fmt.Errorf("lookup %s: %w", key, ErrMissing)
}
return nil
}
func main() {
var key = "ok"
err := lookup(key)
errText := "none"
if err != nil {
errText = err.Error()
}
isMissing := errors.Is(err, ErrMissing)
fmt.Println("key=", key)
fmt.Println("err=", errText)
fmt.Println("is_missing=", isMissing)
}
key ← "missing"
17func main() {18 var key→ "missing" = "missing" //@key="ok", "missing"19 err := lookup(key"missing")20 errText := "none"func lookup(key string) error
10func lookup(key"missing" string) error {11 if key == "missing" {if key == "missing"
10func lookup(key string) error {11 if key"missing" == "missing" {12 return fmt.Errorf("lookup %s: %w", key"missing", ErrMissing&errors.errorString{s:"missing record"})13 }err ← &fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)}
18var key = "missing" //@key="ok", "missing"19err→ &fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)} := lookup(key"missing")20errText→ "none" := "none"21if err != nil {errText ← "lookup missing: missing record"
20errText := "none"21if err&fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)} != nil {22 errText→ "lookup missing: missing record" = err&fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)}.Error()23}isMissing ← true
23 }24 isMissing→ true := errors.Is(err&fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)}, ErrMissing&errors.errorString{s:"missing record"})2526 fmt.Println("key=", key"missing")27 fmt.Println("err=", errText"lookup missing: missing record")28 fmt.Println("is_missing=", isMissingtrue)29}outputkey= missing err= lookup missing: missing record is_missing= true
key ← "ok"
17func main() {18 var key→ "ok" = "ok"19 err := lookup(key"ok")20 errText := "none"func lookup(key string) error
10func lookup(key"ok" string) error {11 if key == "missing" {12 return fmt.Errorf("lookup %s: %w", key, ErrMissing)13 }14 return nil15}err ← <nil>, errText ← "none", isMissing ← false
18 var key = "ok"19 err→ <nil> := lookup(key"ok")20 errText→ "none" := "none"21 if err != nil {22 errText = err.Error()23 }24 isMissing→ false := errors.Is(err<nil>, ErrMissing&errors.errorString{s:"missing record"})2526 fmt.Println("key=", key"ok")27 fmt.Println("err=", errText"none")28 fmt.Println("is_missing=", isMissingfalse)29}outputkey= ok err= none is_missing= false