创建带错误码的error

NewCode/NewCodef

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

    NewCode(code gcode.Code, text ...string) error
    NewCodef(code gcode.Code, format string, args ...interface{}) error
  • 实例:

    func ExampleNewCode() {
    	err := gerror.NewCode(gcode.New(10000, "", nil), "My Error")
    	fmt.Println(err.Error())
    	fmt.Println(gerror.Code(err))
    
    	// Output:
    	// My Error
    	// 10000
    }
    
    func ExampleNewCodef() {
    	err := gerror.NewCodef(gcode.New(10000, "", nil), "It's %s", "My Error")
    	fmt.Println(err.Error())
    	fmt.Println(gerror.Code(err).Code())
    
    	// Output:
    	// It's My Error
    	// 10000
    }

WrapCode/WrapCodef

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

    WrapCode(code gcode.Code, err error, text ...string) error
    WrapCodef(code gcode.Code, err error, format string, args ...interface{}) error
  • 示例:

    func ExampleWrapCode() {
    	err1 := errors.New("permission denied")
    	err2 := gerror.WrapCode(gcode.New(10000, "", nil), err1, "Custom Error")
    	fmt.Println(err2.Error())
    	fmt.Println(gerror.Code(err2).Code())
    
    	// Output:
    	// Custom Error: permission denied
    	// 10000
    }
    
    func ExampleWrapCodef() {
    	err1 := errors.New("permission denied")
    	err2 := gerror.WrapCodef(gcode.New(10000, "", nil), err1, "It's %s", "Custom Error")
    	fmt.Println(err2.Error())
    	fmt.Println(gerror.Code(err2).Code())
    
    	// Output:
    	// It's Custom Error: permission denied
    	// 10000
    }

NewCodeSkip/NewCodeSkipf

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

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

获取error中的错误码接口

func Code(err error) gcode.Code

当给定的error参数不带有错误码信息时,该方法返回预定义的错误码gcode.CodeNil






Content Menu

  • No labels

9 Comments

  1. 在开发一个微服务,业务异常时需要给调用方返回code和msg,在分层代码上应该在哪一层把这个code确定呢?有这个问题的原因是使用wrapCode时,上一层的code会被覆盖,这样对于一些低层方法的错误code就没有意义。我思考的结论是低层方法不使用code的错误,在service层wrapCode确定code,然后在api时判断是否有code,有的话直接用,没有的话返回通用的code。

    1. 上层的错误码把底层的错误码覆盖是很正常的操作,越上层则越贴近业务,而业务层只关心业务的错误码,而不是底层的错误码。具体排查错误的时候,底层错误码才更具有意义。我的建议是直接Wrap即可,不要顾忌什么层级。

      1. 感谢回复。后面我采用的方法就是您上面说的,不去关心层级,有需要就直接wrap。

      2. 大佬们我有些没理解这个结论,是说因为底层的错误码能更好的溯源,所以最好在底层将错误码抛出上层直接wrap的意思吗?

  2. 请问如何对已有的系统自带的错误码

    {
        "code"0,
        "message""",
        "data"null
    }

    进行补充message的信息呢.这是系统请求成功后的返回,我想设置message为"请求成功了"


    1. 仿造改写官方的MiddlewareHandlerResponse

      1. 谢谢你.但是我没有找到示例呀

        1. 首先中间件的使用 在 cmd.go:https://github.com/gogf/gf-demo-user/blob/a0ac7593eeb7fa58efed5e9ba9e4e10b09cb825e/internal/cmd/cmd.go#L22
          调用的是官方默认的middleware:https://github.com/gogf/gf/blob/be77779affcc6b58d9841001c128956aeac750bc/net/ghttp/ghttp_middleware_handler_response.go#L25
          那么只需要仿造默认的middleware改写下自己需要的功能,在cmd.go替换使用即可

          1. 谢谢你,正在学习中。感谢