protoc-gen-go-aithu-errors
错误处理
使用前需要在proto预定义协议,然后通过proto-gen-go生成帮助代码,可以直接作为error返回。
在errors包中,code为错误详情的大概简写,模型具体结构如下
{
// 错误码,如下可解释该错误类型为Error,来源为System,模块为01,是第00001个错误
"code": "ES0100001",
// 错误原因,定义为业务判定错误码
"reason": "ERROR_NOT_FOUND",
// 错误信息,为用户可读的信息,可作为用户提示内容
"message": "数据不存在",
// 错误元信息,为错误添加附加可扩展信息
"metadata": {}
}
安装工具
# 如果电脑中没有protoc-gen-go需要先安装
# go install google.golang.org/protobuf/cmd/protoc-gen-go
go install gitee.com/dhcy/aithu-protoc/cmd/protoc-gen-go-aithu-errors/v2@latest
# 或者
go get -u gitee.com/dhcy/aithu-protoc/cmd/protoc-gen-go-aithu-errors/v2@latest
错误定义
syntax = "proto3";
package database.v1;
option go_package = "pb/database/service/v1;v1";
// +source=system
// +module=01
// DatabaseReason 数据库状态
enum DatabaseReason{
DATABASE_NONE = 0;
// 数据不存在 +deprecated
ERROR_NOT_FOUND = 1;
// 数据库连接超时
INFO_CONNECT_TIMEOUT = 2;
}
注意事项:
+source=
来源 +module=
模块号 根据实际业务需求填写
- 协议定义格式为
Typ(ERROR,INFO,WARN)_具体错误详情
这种格式定义,如ERROR_NOT_FOUND
- 第0个协议作为保留,会跳过,其他协议注注释协议号必须明确,没有将抛出异常
- 协议号不允许重复,默认范围为
1-99999
这个区间,超出范围将抛出异常
- 如果一个协议需要废弃,但可能还在使用,只需要在注释中标明
+deprecated
废弃标识即可
错误生成
通过proto生成对于的代码:
protoc --proto_path=. \
--go_out=paths=source_relative:. \
--go-aithu-errors_out=paths=source_relative:. \
$(PB_PROTO_FILES)
或者将该命令添加到Makefile中errors项中执行
make errors
使用方式
当业务逻辑中需要响应错误时,可以通过proto定义,然后通过protoc-gen-go-aithu-errors工具生成帮助代码来响应错误
// 通过 proto 生成的代码响应错误,并且包名应替换为自己生成代码后的 package name
v1.ErrorSystemDatabaseNotFound()
// 传递metadata
err :=v1.ErrorSystemDatabaseNotFound()
err = err.WithMetadata(map[string]string{
"foo": "bar",
})
错误断言
err := wrong() // 假设返回一个未知错误
// 通过 errors.Is() 断言
if errors.Is(err,v1.ErrorSystemDatabaseNotFound()) {
// do something
}
// 通过判断 *Error.Reason 和 *Error.Code
e := errors.FromError(err)
if e.Reason == "ERROR_NOT_FOUND" && e.Code == "ES0100001" {
// do something
}
// 通过 proto 生成的代码断言错误,并且包名应替换为自己生成代码后的 package name
if v1.IsErrorSystemDatabaseNotFound(err) {
// do something
})