Error Handling
errors.As: ラップしたポインタ型の原因を取り出す
errors.Asはラップ階層から目的の具体的なエラー型を取り出せます。
Sourceas.go
Go 1.22
package errorexample
import (
"errors"
"fmt"
)
type FieldError struct {
Field string
}
func (e *FieldError) Error() string {
return e.Field + " is invalid"
}
func WrappedFieldError() error {
return fmt.Errorf("request rejected: %w", &FieldError{Field: "email"})
}
func FieldName(err error) string {
var target *FieldError
if errors.As(err, &target) {
return target.Field
}
return ""
}Testas_test.go
Go 1.22
package errorexample
import "testing"
func TestErrorsAsでポインタ型の原因を取り出せる(t *testing.T) {
if got := FieldName(WrappedFieldError()); got != "email" {
t.Fatalf("FieldName() = %q, want email", got)
}
}01Assertion
このテストで確認できること
- *FieldErrorを%wでラップする
- errors.AsでFieldErrorのFieldをemailとして取得する
エラー種別に応じてリトライ、HTTPステータス、表示メッセージを分岐する場合にerrors.Asを使います。targetは取り出したい具体型へのポインタをさらに指す形で渡します。
OBSERVED RESULT
wrapped: request rejected: email is invalid
errors.As → FieldError.Field = email