v1.15版本开始,gerror增加了对自定义错误码的支持。

创建带错误码的error

NewCode/NewCodef

  1. func NewCode(code int, text string) error
  2. func NewCodef(code int, format string, args ...interface{}) error

功能同New/Newf方法,用于创建一个自定义错误信息的error对象,并包含堆栈信息,并增加错误码参数的输入。

WrapCode/WrapCodef

  1. func WrapCode(code int, err error, text string) error
  2. func WrapCodef(code int, err error, format string, args ...interface{}) error

功能同Wrap/Wrapf方法,用于包裹其他错误error对象,构造成多级的错误信息,包含堆栈信息,并增加错误码参数的输入。

NewCodeSkip/NewCodeSkipf

  1. func NewCodeSkip(code, skip int, text string) error
  2. func NewCodeSkipf(code, skip int, format string, args ...interface{}) error

高级方法,开发者一般很少会用到。功能同NewSkip/NewSkipf,用于创建一个自定义错误信息的error对象,并且忽略部分堆栈信息(按照当前调用方法位置往上忽略),并增加错误参数输入。

获取error中的错误码

  1. func Code(err error) int

当给定的error参数不带有错误码信息时,该方法返回-1,否则返回error对应携带的错误码值。

  • gerror的错误码支持负数,因此,注意业务的错误码不能使用-1
  • 此外,如果是GRPC的错误码是不支持负数的,所以定义错误码的时候如果业务上并不需要负数,那么建议都定义为正整数为佳。
  • 需要注意业务项目中错误处理统一使用gerror模块,以防止error错误对象在流程传递的过程当中丢失错误码信息。

使用示例

示例1,NewCode

  1. err := gerror.NewCode(10000, "My Error")
  2. fmt.Println(err.Error())
  3. fmt.Println(gerror.Code(err))
  4. // Output:
  5. // My Error
  6. // 10000

示例2,NewCodef

  1. err := gerror.NewCodef(10000, "It's %s", "My Error")
  2. fmt.Println(err.Error())
  3. fmt.Println(gerror.Code(err))
  4. // Output:
  5. // It's My Error
  6. // 10000

示例3,WrapCode

  1. err1 := errors.New("permission denied")
  2. err2 := gerror.WrapCode(10000, err1, "Custom Error")
  3. fmt.Println(err2.Error())
  4. fmt.Println(gerror.Code(err2))
  5. // Output:
  6. // Custom Error: permission denied
  7. // 10000

示例4,WrapCodef

  1. err1 := errors.New("permission denied")
  2. err2 := gerror.WrapCodef(10000, err1, "It's %s", "Custom Error")
  3. fmt.Println(err2.Error())
  4. fmt.Println(gerror.Code(err2))
  5. // Output:
  6. // It's Custom Error: permission denied
  7. // 10000

Content Menu