当业务需要复杂的错误码定义时,我们推荐灵活使用错误码的Detail
参数来扩展错误码功能。
我们来看个例子。
type BizCode struct {
User User
// ...
}
type User struct {
Id int
Name string
// ...
}
扩展错误码大多数场景下需要使用WithCode
方法:
// WithCode creates and returns a new error code based on given Code.
// The code and message is from given `code`, but the detail if from given `detail`.
func WithCode(code Code, detail interface{}) Code
因此上面我们的自定义扩展可以这么使用:
code := gcode.WithCode(gcode.CodeNotFound, BizCode{
User: User{
Id: 1,
Name: "John",
},
})
fmt.Println(code)
即在错误码中我们可以根据业务场景注入一些自定义的错误码扩展数据,以方便上层获取错误码后做进一步处理。
我们将上面自定义的错误码应用到请求返回中间件中,顶层业务逻辑也可以获取到错误码对应的详情再进一步做相关的业务处理。
func ResponseHandler(r *ghttp.Request) {
r.Middleware.Next()
// There"s custom buffer content, it then exits current handler.
if r.Response.BufferLength() > 0 {
return
}
res, err := r.GetHandlerResponse()
code := gerror.Code(err)
if code == gcode.CodeNil && err != nil {
code = gcode.CodeInternalError
}
if detail, ok := code.Detail().(BizCode); ok {
g.Log().Errorf(r.Context(), `error caused by user "%+v"`, detail.User)
}
_ = r.Response.WriteJson(ghttp.DefaultHandlerResponse{
Code: gcode.CodeOK.Code(),
Message: gcode.CodeOK.Message(),
Data: res,
})
}
在框架Server
默认的日志中会自动打印Detail
数据。
I18N支持模板引擎支持i18n特性,可以通过给上下文注入特定的i18n语言来实现不同的请求/页面使用不同的i18n语言渲染...
ORM组件目前支持常见的三种语法的子查询:Where子查询、Having子查询及From子查询。Where子查询...
基本介绍goframe框架提供了功能强大、使用便捷、灵活易扩展的数据/表单校验组件,由gvalid组件实现。gvalid组件实现...