Error Handling
error: ラップした原因はerrors.Isで照合する
fmt.Errorfの%wで文脈を付けたerrorは、直接比較ではなくerrors.Isで原因を確認します。
Sourcewrap.go
Go 1.22
package errorexample
import (
"errors"
"fmt"
)
var ErrNotFound = errors.New("not found")
func WrappedNotFound() error {
return fmt.Errorf("load profile: %w", ErrNotFound)
}
func IsNotFound(err error) bool {
return errors.Is(err, ErrNotFound)
}Testwrap_test.go
Go 1.22
package errorexample
import "testing"
func TestラップしたerrorはerrorsIsで原因と照合できる(t *testing.T) {
err := WrappedNotFound()
if err == ErrNotFound {
t.Fatal("wrapped error should not be directly equal to its cause")
}
if !IsNotFound(err) {
t.Fatal("errors.Is should find the wrapped cause")
}
}01Assertion
このテストで確認できること
- ラップしたerrorは元のsentinel errorと直接等しくない
- errors.Isは原因のErrNotFoundを見つける
操作の文脈を失わずに分岐したいときは%wでラップします。呼び出し側は文字列比較でなくerrors.Isまたはerrors.Asを使います。
OBSERVED RESULT
wrapped == ErrNotFound → false
errors.Is(wrapped, ErrNotFound) → true