# README
ecode
背景
错误码一般被用来进行异常传递,且需要具有携带message
文案信息的能力。
错误码之Codes
在sky_blue
里,错误码被设计成Codes
接口,声明如下代码位置:
// Codes ecode error interface which has a code & message.
type Codes interface {
// sometimes Error return Code in string form
// NOTE: don't use Error in monitor report even it also work for now
Error() string
// Code get error code.
Code() int
// Message get code message.
Message() string
//Detail get error detail,it may be nil.
Details() []interface{}
}
// A Code is an int error code spec.
type Code int
可以看到该接口一共有四个方法,且type Code int
结构体实现了该接口。
注册message
一个Code
错误码可以对应一个message
,默认实现会从全局变量_messages
中获取,业务可以将自定义Code
对应的message
通过调用Register
方法的方式传递进去,如:
cms := map[int]string{
0: "success",
101: "param is error",
}
ecode.Register(cms)
fmt.Println(ecode.OK.Message()) // 输出:很好很强大!
注意:map[int]string
类型并不是绝对,比如有业务要支持多语言的场景就可以扩展为类似map[int]LangStruct
的结构,因为全局变量_messages
是atomic.Value
类型,只需要修改对应的Message
方法实现即可。
Details
Details
接口为gRPC
预留
转换为ecode
错误码转换有以下两种情况:
- 因为框架传递错误是靠
ecode
错误码,比如bm框架返回的code
字段默认就是数字,那么客户端接收到如{"code":404}
的话,可以使用ec := ecode.Int(404)
或ec := ecode.String("404")
来进行转换。 - 在项目中
dao
层返回一个错误码,往往返回参数类型建议为error
而不是ecode.Codes
,因为error
更通用,那么上层service
就可以使用ec := ecode.Cause(err)
进行转换。
判断
错误码判断是否相等:
ecode
与ecode
判断使用:ecode.Equal(ec1, ec2)
ecode
与error
判断使用:ecode.EqualError(ec, err)
package ecode
import (
"github.com/zdao-pro/sky_blue/pkg/ecode"
)
var _ ecode.Codes
// UserErrCode
var (
UserNotLogin = ecode.New(144, 'user no login');
)
# Variables
访问权限不足.
客户端取消请求.
冲突.
服务调用超时.
禁止进入.
超出限制.
不支持该方法.
啥都木有.
木有改动.
请求成功.
请求参数错误.
授权限制.
请求错误.
服务器内部错误.
过载保护,服务暂不可用.
撞车跳转.
Token校验失败.
未认证.
# Interfaces
Codes ..
# Type aliases
A Code is an int error code spec.