Go によるサンプル: カスタムエラー

カスタムタイプは、それらに Error() メソッドを実装することにより、error として使用できます。これは、引数エラーを明示的に表すためにカスタムタイプを使用している上記のサンプルの変種です。

package main
import (
    "errors"
    "fmt"
)

カスタムエラータイプには通常、「Error」というサフィックスが付いています。

type argError struct {
    arg     int
    message string
}

この Error メソッドを追加すると、argError は error インターフェイスを実装します。

func (e *argError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.message)
}
func f(arg int) (int, error) {
    if arg == 42 {

カスタムエラーを返します。

        return -1, &argError{arg, "can't work with it"}
    }
    return arg + 3, nil
}
func main() {

errors.As は、errors.Is のより高度なバージョンです。特定のエラータイプと一致する指定されたエラー(または、そのチェーン内のエラー)をチェックし、その型の値に変換し、true を返します。一致が見つからない場合は false を返します。

    _, err := f(42)
    var ae *argError
    if errors.As(err, &ae) {
        fmt.Println(ae.arg)
        fmt.Println(ae.message)
    } else {
        fmt.Println("err doesn't match argError")
    }
}
$ go run custom-errors.go
42
can't work with it

次の例: ゴルーチン