Go 1.13 の error について
備忘録。
Go 1.13 で入った error の機能について。
errors.As
fmt.Errorf
/errors.Unwrap
Java の new Excepion(String msg, Throwable cause)
のように、error
インスタンスを別の error
インスタンスでラップできるようになった。
err := errors.New("myerror") wrapper := fmt.Errorf("wrap %w", err)
ちなみに %w
を2つ以上指定すると警告は出るがエラーにはならない。
メッセージには %w
の位置に元のエラーの Error()
が埋め込まれる。
wrapper.Error() // => wrap myerror
errors.Unwrap
で元のインスタンスを取り出すことができる
errors.Unwrap(wrapper) // => err errors.Unwrap(err) // => nil
errors.Is
/errors.As
これまでライブラリが事前定義したエラー(E.g. io.EOF
)は ==
で比較していたが、公式のインタフェースとして errors.Is
を使うようになる
errors.Is(err, io.EOF)
また、ライブラリが定義するエラー型かどうかを判定するには errors.As
を使う。例えばあるライブラリが定義する AuthError
型かどうかをチェックするには以下のようにする。
var e AuthError
errors.As(err, &e)
これらの関数は別のエラーをラップしていた場合、それらも辿って調べる。