技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

カスタムエラー【Go】

fmtパッケージによるerrorの出力内容を変更できる、interfaceです。
stringerと同様です。interfaceは次のように定義されています。

type error interface {
    Error() string
}

よって、Error() stringを、対象とする型のメソッドに指定して、
編集した内容をreturnするだけです。

type UserNotFound struct {
    UserName string
}

func (err *UserNotFound) Error() string {    // errorの場合は、必ずポインタレシーバーとする。他エラーと区別して処理を分けるには、アドレスが必要なため
    return fmt.Sprintf("Sorry. This user is not found. :%v", err.UserName)
}

func SearchUser() error {
    ok := false    // 単純にするため、意図的にerrorを返すようにする
    if ok {
        return nil
    }
    return &UserNotFound{"Mike"}    // Error()がポインタレシーバーなので、アドレスとしてerrorを返す
}

func main() {
    if err := SearchUser(); err != nil {
        fmt.Println(err)    // Sorry. This user is not found. :Mike
    }
}


注意点は、Error()メソッドをポインタレシーバーにすることです。
値レシーバーにしてしまうと、プログラム的にerror内容による区別がつけられなくなり、
例えば任意に発生させるエラーの内容と、ioパッケージが返すエラーの内容の違いを
プログラム上で認識させて、場合分けするといったことができなくなります。