从 v1.15
版本开始, gerror
增加了对自定义错误码的支持。
创建带错误码的 error
NewCode/NewCodef
func NewCode(code int, text string) error
func NewCodef(code int, format string, args ...interface{}) error
功能同 New/Newf
方法,用于创建一个自定义错误信息的 error
对象,并包含堆栈信息,并增加错误码参数的输入。
WrapCode/WrapCodef
func WrapCode(code int, err error, text string) error
func WrapCodef(code int, err error, format string, args ...interface{}) error
功能同 Wrap/Wrapf
方法,用于包裹其他错误 error
对象,构造成多级的错误信息,包含堆栈信息,并增加错误码参数的输入。
NewCodeSkip/NewCodeSkipf
func NewCodeSkip(code, skip int, text string) error
func NewCodeSkipf(code, skip int, format string, args ...interface{}) error
高级方法,开发者一般很少会用到。功能同 NewSkip/NewSkipf
,用于创建一个自定义错误信息的 error
对象,并且忽略部分堆栈信息(按照当前调用方法位置往上忽略),并增加错误参数输入。
获取 error
中的错误码
func Code(err error) int
当给定的 error
参数不带有错误码信息时,该方法返回 -1
,否则返回 error
对应携带的错误码值。
gerror
的错误码支持负数,因此,注意业务的错误码不能使用-1
。- 注意
GRPC
的错误码是不支持负数的,所以业务上的错误码建议都为正数。 - 此外,建议业务上定义的错误码
>1000
,未来可能框架层面会保留一定错误码内部使用。 - 需要注意业务项目中错误处理统一使用
gerror
模块,以防止error
错误对象在流程传递的过程当中丢失错误码信息。
使用示例
示例1, NewCode
err := gerror.NewCode(10000, "My Error")
fmt.Println(err.Error())
fmt.Println(gerror.Code(err))
// Output:
// My Error
// 10000
示例2, NewCodef
err := gerror.NewCodef(10000, "It's %s", "My Error")
fmt.Println(err.Error())
fmt.Println(gerror.Code(err))
// Output:
// It's My Error
// 10000
示例3, WrapCode
err1 := errors.New("permission denied")
err2 := gerror.WrapCode(10000, err1, "Custom Error")
fmt.Println(err2.Error())
fmt.Println(gerror.Code(err2))
// Output:
// Custom Error: permission denied
// 10000
示例4, WrapCodef
err1 := errors.New("permission denied")
err2 := gerror.WrapCodef(10000, err1, "It's %s", "Custom Error")
fmt.Println(err2.Error())
fmt.Println(gerror.Code(err2))
// Output:
// It's Custom Error: permission denied
// 10000