Go error 如何携带更多信息(比如错误码信息)

19 min read

Go error 可以通过实现 error 接口来携带更多信息,例如错误码信息。

定义一个带错误码信息的错误类型:

type MyError struct {
    code int
    msg  string
}

func (e MyError) Error() string {
    return fmt.Sprintf("%s: %d", e.msg, e.code)
}

然后在返回错误时创建该类型的实例,并将错误码和错误信息传递给构造函数:

func doSomething() error {
    return MyError{code: 123, msg: "something went wrong"}
}

在处理错误时,可以使用类型断言或类型判断来访问错误码信息:

err := doSomething()
if err != nil {
    if e, ok := err.(MyError); ok {
        fmt.Printf("error code: %d, error message: %s", e.code, e.msg)
    } else {
        fmt.Println(err)
    }
}

使用这种方法,我们可以在错误信息中携带更多的上下文信息,以便在调试和维护代码时更容易理解发生了什么错误。