Go 1.13 の error について

備忘録。

Go 1.13 で入った error の機能について。

errors.As

fmt.Errorf/errors.Unwrap

Javanew 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)

これらの関数は別のエラーをラップしていた場合、それらも辿って調べる。