当业务需要更复杂的错误码定义时,我们可以自定义实现业务自己的错误码,只需要实现gcode.Code相关的接口即可。

我们来看个例子。

自定义错误码

定义结构体并实现gcode.code接口定义的方法

type BizCode struct {
	code    int
	message string
	detail  BizCodeDetail
}
type BizCodeDetail struct {
	Code     string
	HttpCode int
}

func (c BizCode) BizDetail() BizCodeDetail {
	return c.detail
}

func (c BizCode) Code() int {
	return c.code
}

func (c BizCode) Message() string {
	return c.message
}

func (c BizCode) Detail() interface{} {
	return c.detail
}

func New(httpCode int, code string, message string) gcode.Code {
	return BizCode{
		code:    0,
		message: message,
		detail: BizCodeDetail{
			Code:     code,
			HttpCode: httpCode,
		},
	}
}

定义业务错误码

var (
	CodeNil      = New(200, "OK", "")
	CodeNotFound = New(404, "Not Found", "Resource does not exist")
	CodeInternal = New(500, "Internal Error", "An error occurred internally")
	// ...
)

使用到中间件

func ResponseHandler(r *ghttp.Request) {
	r.Middleware.Next()
	// There's custom buffer content, it then exits current handler.
	if r.Response.BufferLength() > 0 {
		return
	}
	var (
		err  = r.GetError()
		res  = r.GetHandlerResponse()
		code = gerror.Code(err)
	)
	if code == gcode.CodeNil && err != nil {
		code = CodeInternal
	} else {
		code = CodeNil
	}
	if bizCode, ok := code.(BizCode); ok {
		r.Response.WriteStatus(bizCode.BizDetail().HttpCode)
	}
	r.Response.WriteJson(g.Map{
		`code`:    gcode.CodeOK.Code(),
		`message`: gcode.CodeOK.Message(),
		`data`:    res,
	})
}







Content Menu

  • No labels

9 Comments

  1. 错误处理这里,怎么使用自定义的code? 比如参数校验失败默认返回的code是51。我想使用别的

  2. if err != nil {
    		err = gerror.NewCode(gcode.New(30001, "添加模型分类失败", nil))
    
    		return nil, err
    	}

    我是这么写的

    1. 我在service层也是这样处理的。但是如果用参数校验的话。还是会返回框架自带的code 51。难道要重写校验这一块吗?

      1. 验证失败,返回51 是对的,  前端判断一下呗,非200抛异常也没毛病

      2. 要不然你得重新封装errcode那个包

      3. 51是框架的校验错误错误码,你可以通过后置中间件覆盖默认的错误码行为。

    2. 这样用 为什么控制台会报错

  3. 郭强 中间件示例中,是不是该把

    r.Response.WriteStatus(bizCode.BizDetail().HttpCode)

    换成

    r.Response.Writer.WriteHeader(bizCode.BizDetail().HttpCode)

    否则多打印的描述文本,似乎破坏返回的json结构了

    另外,咋现在编辑不了文档了

  4. 请问一下,如何获取到gcode 中code为52,即数据库操作失败的情况,并将错误信息返回到响应体中呢
    或者说http状态里有哪个是对应这个code52么?