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

23 min read

Go语言的标准库提供了一个接口error来表示错误信息,该接口只有一个方法Error(),返回一个字符串表示错误信息。一般情况下,错误信息字符串中已经包含了足够的信息来描述错误的原因和背景。但对于某些场景,如果需要更多的信息(例如错误码),可以考虑以下几种方式:

  1. 通过自定义错误类型来携带更多信息

可以定义一个结构体类型来实现error接口,然后在该结构体中添加相应的字段来携带更多信息。比如:

type MyError struct {
    ErrorCode int
    Message   string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("%d: %s", e.ErrorCode, e.Message)
}

这样就可以把错误码和错误信息一起传递了。

  1. 在错误信息字符串中包含更多信息

在错误信息字符串中添加更多的信息也是常用的方法。比如:

func MyFunc() error {
    return fmt.Errorf("Error occurred. Error code: %d", 123)
}

这样就可以在错误信息中添加额外的错误码信息。

  1. 使用结构体来返回错误信息和错误码等相关信息

在某些复杂的场景下,将错误信息和错误码等相关信息封装成一个结构体,一起返回也是一种不错的选择。比如:

type MyErrorResult struct {
    ErrorCode int
    ErrorMessage string
    // 其他相关信息
}

func MyFunc() (*MyErrorResult, error) {
    // 逻辑代码
    if err != nil {
        return &MyErrorResult{ErrorCode: 123, ErrorMessage: "Error occurred."}, err
    }
    // 更多代码
}

这样就可以在error接口中返回自定义结构体,从而携带更多的信息。