protoc-gen-go-aithu-errors

command module
v2.0.0-...-dd4f76f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 15, 2022 License: GPL-3.0 Imports: 8 Imported by: 0

README

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
})

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL