创建带错误码的 error

NewCode/NewCodef

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

  • 格式:

    1. // NewCode creates and returns an error that has error code and given text.
    2. NewCode(code gcode.Code, text ...string) error
    3. // NewCodef returns an error that has error code and formats as the given format and args.
    4. NewCodef(code gcode.Code, format string, args ...interface{}) error
  • 实例:

    1. func ExampleNewCode() {
    2. err := gerror.NewCode(gcode.New(10000, "", nil), "My Error")
    3. fmt.Println(err.Error())
    4. fmt.Println(gerror.Code(err))
    5. // Output:
    6. // My Error
    7. // 10000
    8. }
    9. func ExampleNewCodef() {
    10. err := gerror.NewCodef(gcode.New(10000, "", nil), "It's %s", "My Error")
    11. fmt.Println(err.Error())
    12. fmt.Println(gerror.Code(err).Code())
    13. // Output:
    14. // It's My Error
    15. // 10000
    16. }

WrapCode/WrapCodef

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

  • 格式:

    1. // WrapCode wraps error with code and text.
    2. // It returns nil if given err is nil.
    3. WrapCode(code gcode.Code, err error, text ...string) error
    4. // WrapCodef wraps error with code and format specifier.
    5. // It returns nil if given `err` is nil.
    6. WrapCodef(code gcode.Code, err error, format string, args ...interface{}) error
  • 示例:

    1. func ExampleWrapCode() {
    2. err1 := errors.New("permission denied")
    3. err2 := gerror.WrapCode(gcode.New(10000, "", nil), err1, "Custom Error")
    4. fmt.Println(err2.Error())
    5. fmt.Println(gerror.Code(err2).Code())
    6. // Output:
    7. // Custom Error: permission denied
    8. // 10000
    9. }
    10. func ExampleWrapCodef() {
    11. err1 := errors.New("permission denied")
    12. err2 := gerror.WrapCodef(gcode.New(10000, "", nil), err1, "It's %s", "Custom Error")
    13. fmt.Println(err2.Error())
    14. fmt.Println(gerror.Code(err2).Code())
    15. // Output:
    16. // It's Custom Error: permission denied
    17. // 10000
    18. }

NewCodeSkip/NewCodeSkipf

  • 说明:功能同 NewCode/NewCodef,用于创建一个带错误码的 error 对象,但忽略部分堆栈信息(按照当前调用方法位置往上忽略)。

  • 格式:

    1. // NewCodeSkip creates and returns an error which has error code and is formatted from given text.
    2. // The parameter `skip` specifies the stack callers skipped amount.
    3. func NewCodeSkip(code, skip int, text string) error
    4. // NewCodeSkipf returns an error that has error code and formats as the given format and args.
    5. // The parameter `skip` specifies the stack callers skipped amount.
    6. func NewCodeSkipf(code, skip int, format string, args ...interface{}) error

WrapCodeSkip/WrapCodeSkipf

  • 说明:功能同 WrapCodeSkip/WrapCodeSkipf,用于包裹一个带错误码的 error 对象,但忽略部分堆栈信息(按照当前调用方法位置往上忽略)。

  • 格式:

    1. // WrapCodeSkip wraps error with code and text.
    2. // It returns nil if given err is nil.
    3. // The parameter `skip` specifies the stack callers skipped amount.
    4. func WrapCodeSkip(code gcode.Code, skip int, err error, text ...string) error
    5. // WrapCodeSkipf wraps error with code and text that is formatted with given format and args.
    6. // It returns nil if given err is nil.
    7. // The parameter `skip` specifies the stack callers skipped amount.
    8. func WrapCodeSkipf(code gcode.Code, skip int, err error, format string, args ...interface{}) error

Code

  • 说明:获取错误对象中的错误码。该方法会递归获取,如果当前错误对象不存在错误码时,该方法会追溯查找其上一级错误对象的错误码,以此类推。当给定的 error 参数不带有错误码信息时,该方法返回预定义的错误码 gcode.CodeNil

  • 格式:

    1. // Code returns the error code of `current error`.
    2. // It returns `CodeNil` if it has no error code neither it does not implement interface Code.
    3. func Code(err error) gcode.Code
  • 示例:

    1. func ExampleCode() {
    2. err1 := gerror.NewCode(gcode.CodeInternalError, "permission denied")
    3. err2 := gerror.Wrap(err1, "operation failed")
    4. fmt.Println(gerror.Code(err1))
    5. fmt.Println(gerror.Code(err2))
    6. // Output:
    7. // 50:Internal Error
    8. // 50:Internal Error
    9. }

HasCode

  • 说明:该方法判断给定的错误对象中是否包含指定的错误码。与Code方法类似,该方法也会追溯查找上一级错误的错误码。

  • 格式:

    1. // HasCode checks and reports whether `err` has `code` in its chaining errors.
    2. func HasCode(err error, code gcode.Code) bool
  • 示例:

    1. func ExampleHasCode() {
    2. err1 := gerror.NewCode(gcode.CodeInternalError, "permission denied")
    3. err2 := gerror.Wrap(err1, "operation failed")
    4. fmt.Println(gerror.HasCode(err1, gcode.CodeOK))
    5. fmt.Println(gerror.HasCode(err2, gcode.CodeInternalError))
    6. // Output:
    7. // false
    8. // true
    9. }