# README
ecode(来自kratos官方文档)
背景
错误码一般被用来进行异常传递,且需要具有携带message
文案信息的能力。
错误码之Codes
在kratos
里,错误码被设计成Codes
接口(interface{}
类型),声明如下代码位置:
// 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: "很好很强大!",
-304: "啥都没变啊~",
-404: "啥都没有啊~",
}
ecode.Register(cms)
fmt.Println(ecode.OK.Message()) // 输出:很好很强大!
注意:map[int]string
类型并不是绝对,比如有业务要支持多语言的场景就可以扩展为类似map[int]LangStruct
的结构,因为全局变量_messages
是atomic.Value
类型,只需要修改对应的Message
方法实现即可。
Details
Details
接口为gRPC
预留,gRPC
传递异常会将服务端的错误码pb序列化之后赋值给Details
,客户端拿到之后反序列化得到,具体可阅读status
的实现:
ecode
包内的Status
结构体实现了Codes
接口代码位置warden/internal/status
包内包装了ecode.Status
和grpc.Status
进行互相转换的方法代码位置warden
的client
和server
则使用转换方法将gRPC
底层返回的error
最终转换为ecode.Status
代码位置
转换为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)
使用工具生成
使用proto协议定义错误码,格式如下:
// user.proto
syntax = "proto3";
package ecode;
enum UserErrCode {
UserUndefined = 0; // 因protobuf协议限制必须存在!!!无意义的0,工具生成代码时会忽略该参数
UserNotLogin = 123; // 正式错误码
}
需要注意以下几点:
- 必须是enum类型,且名字规范必须以"ErrCode"结尾,如:UserErrCode
- 因为protobuf协议限制,第一个enum值必须为无意义的0
使用kratos tool protoc --ecode user.proto
进行生成,生成如下代码:
package ecode
import (
"github.com/go-kratos/kratos/pkg/ecode"
)
var _ ecode.Codes
// UserErrCode
var (
UserNotLogin = ecode.New(123);
)
# Packages
No description provided by the author
# Functions
Cause 方法:将error类型转换为项目Codes,生成错误必须调用errors包提供的方法生成!.
Equal equal a and b by code int.
EqualError equal error.
根据int和message构造 Status对象.
Errorf new status with code and message.
FromCode create status from ecode.
FromProto new status from grpc detail.
Int parse code int to error.
New new a ecode.Codes by int value.
Register register ecode message map.
String parse code string to error.
# Variables
访问权限不足.
客户端取消请求.
冲突.
服务调用超时.
超出限制 (服务端限流返回此错误).
不支持该方法.
啥都木有.
木有改动.
正确.
请求错误.
服务器错误.
过载保护,服务暂不可用(客户端熔断返回此错误).
302跳转.
未认证.
# Interfaces
Codes ecode error interface which has a code & message.
# Type aliases
Code 是 Codes实例化类型,本项目的错误码就是int,因为Codes实现了Error()方法,所以可以直接当做error返回 A Code is an int error code spec.