errors

package
v1.3.3 Latest Latest
Warning

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

Go to latest
Published: Mar 17, 2026 License: Apache-2.0 Imports: 3 Imported by: 0

README

errors

Go-Kit 错误处理包,提供统一的错误码定义、层级匹配和错误实例化能力。

特性

  • 显式/自动注册:手动指定 code,或自动分配(从 4000 开始)
  • 层级匹配:通过 Class 字段建立错误层次,支持 errors.Is 向上匹配
  • HTTP 状态码:错误定义可绑定 HTTP 状态码,自动继承父类
  • 标准库兼容errors.Iserrors.AsUnwrap 完全兼容
  • 文档生成:支持导出错误码列表生成文档

安装

go get github.com/tsopia/go-kit/errors

快速开始

package main

import (
    "errors"
    "fmt"

    kiterr "github.com/tsopia/go-kit/errors"
)

func main() {
    // 1. 注册错误(显式 code)
    ErrUserNotFound := kiterr.Register(3001, "USER_NOT_FOUND").WithHTTP(404)

    // 2. 创建错误
    err := ErrUserNotFound.New("用户 123 不存在")

    // 3. 判断错误
    if errors.Is(err, ErrUserNotFound) {
        fmt.Println("用户不存在")
    }

    // 4. 获取信息
    fmt.Println(kiterr.Code(err))     // 3001
    fmt.Println(kiterr.Name(err))     // USER_NOT_FOUND
    fmt.Println(kiterr.HTTPCode(err)) // 404
}

API 说明

错误注册
// 显式注册(推荐用于 API 暴露的错误)
errDef := kiterr.Register(3001, "USER_NOT_FOUND")

// 自动分配 code(从 4000 开始)
autoDef := kiterr.NewDefinition("EMAIL_NOT_VERIFIED")
创建错误实例
// 简单错误
err := errDef.New("用户不存在")

// 格式化消息
err := errDef.Newf("用户 %s 不存在", userID)

// 包装底层错误
err := errDef.Wrap(dbErr, "查询用户失败")

// 格式化包装
err := errDef.Wrapf(dbErr, "查询用户 %s 失败", userID)
层级匹配
// 建立层级:NotFound -> UserNotFound -> UserDeleted
base := kiterr.NotFound  // code=2001, http=404
child := kiterr.Register(3101, "USER_NOT_FOUND")
child.Class = base

// 匹配
err := child.New("用户不存在")
errors.Is(err, child)  // true
errors.Is(err, base)   // true(层级匹配)
辅助函数
函数 说明
Code(err) 获取错误码,非 codedError 返回 0
Name(err) 获取错误名,非 codedError 返回 ""
HTTPCode(err) 获取 HTTP 状态码,默认 500
Export() 导出所有注册的错误定义
预定义错误
kiterr.NotFound      // 2001, 404
kiterr.InvalidParam  // 2002, 400
kiterr.Unauthorized  // 2003, 401
kiterr.Forbidden     // 2004, 403
kiterr.Internal      // 2005, 500
kiterr.Timeout       // 2006, 504
kiterr.BadGateway    // 2007, 502

错误码范围

范围 用途
1000-1999 保留
2000-2999 工具库 Sentinel
3000-3999 推荐用户显式注册
4000+ 自动分配起始

导出错误码文档

// errors/export_test.go
func TestGenerateDoc(t *testing.T) {
    if os.Getenv("GEN_ERR_DOC") != "1" {
        t.Skip()
    }
    // 生成 docs/error-codes.md
}

运行:

GEN_ERR_DOC=1 go test ./errors -run TestGenerateDoc -v

完整示例

package main

import (
    "errors"
    "fmt"

    kiterr "github.com/tsopia/go-kit/errors"
)

func main() {
    // 定义业务错误
    ErrOrder := kiterr.Register(5100, "ORDER_ERROR").WithHTTP(400)
    ErrOrderNotFound := kiterr.Register(5101, "ORDER_NOT_FOUND")
    ErrOrderNotFound.Class = ErrOrder

    // 模拟底层错误
    dbErr := fmt.Errorf("db connection timeout")

    // 创建包装错误
    err := ErrOrderNotFound.Wrap(dbErr, "查询订单 12345 失败")

    // 判断和处理
    switch {
    case errors.Is(err, ErrOrderNotFound):
        fmt.Printf("[%d] %s: 订单不存在\n", kiterr.Code(err), kiterr.Name(err))
    case errors.Is(err, ErrOrder):
        fmt.Printf("[%d] %s: 订单相关错误\n", kiterr.Code(err), kiterr.Name(err))
    }

    // 获取 HTTP 状态码返回给客户端
    httpCode := kiterr.HTTPCode(err)
    fmt.Printf("HTTP Status: %d\n", httpCode)
}

测试

go test ./errors -v

许可证

MIT

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// Sentinel 错误定义,code 范围 2000-2999。
	NotFound     = Register(2001, "NOT_FOUND").WithHTTP(http.StatusNotFound)
	InvalidParam = Register(2002, "INVALID_PARAM").WithHTTP(http.StatusBadRequest)
	Unauthorized = Register(2003, "UNAUTHORIZED").WithHTTP(http.StatusUnauthorized)
	Forbidden    = Register(2004, "FORBIDDEN").WithHTTP(http.StatusForbidden)
	Internal     = Register(2005, "INTERNAL_ERROR").WithHTTP(http.StatusInternalServerError)
	Timeout      = Register(2006, "TIMEOUT").WithHTTP(http.StatusGatewayTimeout)
	BadGateway   = Register(2007, "BAD_GATEWAY").WithHTTP(http.StatusBadGateway)
)

Functions

func Code added in v1.1.0

func Code(err error) int

Code 返回 codedError 的错误码,非 codedError 返回 0。

func HTTPCode added in v1.1.0

func HTTPCode(err error) int

HTTPCode 返回 codedError 对应的 HTTP 状态码,默认 500。

func Name added in v1.1.0

func Name(err error) string

Name 返回 codedError 的错误名,非 codedError 返回空字符串。

Types

type Definition added in v1.1.0

type Definition struct {
	Code  int
	Name  string
	Class *Definition
	HTTP  int
}

Definition 描述一个错误定义。

func NewDefinition added in v1.1.0

func NewDefinition(name string) *Definition

NewDefinition 在全局注册表中创建或返回同名错误定义。

func Register added in v1.1.0

func Register(code int, name string) *Definition

Register 在全局注册表中注册错误定义。

func (*Definition) Error added in v1.1.0

func (d *Definition) Error() string

Error 让 Definition 可作为 errors.Is 的 target 使用。

func (*Definition) New added in v1.1.0

func (d *Definition) New(msg string) error

New 创建一个带当前定义的错误实例。

func (*Definition) Newf added in v1.1.0

func (d *Definition) Newf(format string, args ...interface{}) error

Newf 按格式化字符串创建错误实例。

func (*Definition) WithHTTP added in v1.1.0

func (d *Definition) WithHTTP(code int) *Definition

WithHTTP 返回附带 HTTP 状态码的新定义副本。

func (*Definition) Wrap added in v1.1.0

func (d *Definition) Wrap(cause error, msg string) error

Wrap 使用当前定义包装底层错误。

func (*Definition) Wrapf added in v1.1.0

func (d *Definition) Wrapf(cause error, format string, args ...interface{}) error

Wrapf 使用格式化消息包装底层错误。

type ErrorInfo added in v1.1.0

type ErrorInfo struct {
	Code  int
	Name  string
	Class string
}

ErrorInfo 是导出的错误定义快照。

func Export added in v1.1.0

func Export() []ErrorInfo

Export 导出全局注册表中的所有错误定义信息。

type Registry added in v1.1.0

type Registry struct {
	// contains filtered or unexported fields
}

Registry 保存错误定义注册信息。

func NewRegistry added in v1.1.0

func NewRegistry() *Registry

NewRegistry 创建注册表,自动编码从 4000 开始。

func (*Registry) Export added in v1.1.0

func (r *Registry) Export() []ErrorInfo

Export 导出当前注册表中的所有错误定义信息。

func (*Registry) New added in v1.1.0

func (r *Registry) New(name string) *Definition

New 为 name 创建或返回已存在定义。

func (*Registry) Register added in v1.1.0

func (r *Registry) Register(code int, name string) *Definition

Register 使用指定 code/name 注册定义。 重复 code 或 name 都视为编程错误并 panic。

Jump to

Keyboard shortcuts

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