xerrors

package
v0.5.0 Latest Latest
Warning

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

Go to latest
Published: Mar 29, 2026 License: MIT Imports: 2 Imported by: 0

README

xerrors

Go Reference

xerrors 是 Genesis 的 Level 0 基础组件,提供一组与标准库 errors 完全兼容的轻量错误辅助工具。它的目标不是替代 errors,也不是构建一套复杂的错误框架,而是在不改变 Go 错误链语义的前提下,补齐几个高频且稳定的工程能力。

组件定位

xerrors 主要解决四类问题:

  • 给错误追加上下文,同时保留 errors.Is / errors.As
  • 给错误附加一个轻量的机器可读错误码
  • 在初始化阶段提供 Must / MustOK 这类“失败即 panic”的辅助函数
  • 在顺序校验流程里简化“保留第一个错误”与“合并多个错误”的写法

提供 stack trace、错误分类体系、并发安全的聚合器,也不负责统一 HTTP / gRPC / MQ 的协议层错误模型。

快速开始

import "github.com/ceyewan/genesis/xerrors"

最常见的用法仍然是围绕标准库错误链做轻量封装:

func loadConfig(path string) error {
    file, err := os.Open(path)
    if err != nil {
        return xerrors.Wrap(err, "open config file")
    }
    defer file.Close()
    return nil
}

核心能力

1. 错误包装

WrapWrapf 用于给底层错误追加上下文,同时保留原始错误链:

user, err := repo.FindByID(ctx, userID)
if err != nil {
    return nil, xerrors.Wrapf(err, "find user %d", userID)
}
2. 轻量错误码

WithCodeGetCode 适合做轻量的机器可读错误码传递:

err := xerrors.WithCode(ErrUserNotFound, "USER_NOT_FOUND")

if code := xerrors.GetCode(err); code == "USER_NOT_FOUND" {
    // 映射到上层协议错误
}

这里的 code 只是一个字符串,不承担更复杂的错误元数据职责。

3. 初始化断言

MustMustOK 只建议用于应用启动、依赖装配或测试辅助代码:

cfg := xerrors.Must(config.Load("config.yaml"))
logger := xerrors.Must(clog.New(&cfg.Log))

运行时业务逻辑不应该依赖 Must,否则会把普通错误处理升级成进程级 panic。

4. 顺序错误收集与合并

Collector 的语义很窄:它只保留第一个nil 错误,适合顺序校验流程。它不是并发安全容器,也不是“收集所有错误”的聚合器。

Combine 则用于把多个错误合并成一个返回值:

  • 全为 nil 时返回 nil
  • 只有一个非 nil 错误时直接返回该错误
  • 多个非 nil 错误时返回 *MultiError

推荐实践

  • 业务代码里优先使用 Wrap / Wrapf 追加上下文,而不是重新丢失错误链。
  • Sentinel error 仍然使用 xerrors.New(...) 定义,再通过 errors.Is / xerrors.Is 判断。
  • 只有在确实需要协议映射或稳定机器码时,才使用 WithCode
  • Collector 适合“顺序校验多个字段,返回第一个错误”的场景;如果需要保留所有错误,应直接使用 Combine 或在上层定义更明确的数据结构。
  • Must 仅用于初始化和测试,不应进入运行时业务分支。

能力边界

如果你的需求是:

  • 自动采集 stack trace
  • 统一建模公共错误结构
  • 为 HTTP / gRPC / GraphQL 等协议自动生成错误响应
  • 提供并发安全的错误聚合器

那么 xerrors 不是合适的组件。它的设计重点是保持与标准库一致、接口极小、行为可预测

相关文档

Documentation

Overview

Package xerrors 提供 Genesis 的轻量错误封装工具。

这个组件的目标不是替代标准库 errors,也不是提供完整的错误框架,而是在保持 Go 错误链语义不变的前提下,补齐几个高频且稳定的工程能力:

  • 使用 Wrap / Wrapf 为错误追加上下文,同时保留 errors.Is / errors.As 链路
  • 使用 WithCode / GetCode 为错误补充一个轻量的机器可读错误码
  • 使用 Collector / Combine 简化多步骤校验和多错误合并
  • 使用 Must / MustOK 处理初始化阶段的“失败即 panic”场景

xerrors 刻意保持克制。它当前不提供 stack trace、错误分类体系、并发安全的错误 聚合器,也不试图替应用统一建模所有协议层错误。对大多数业务代码来说,它更像 是“标准库 errors 的工程补充层”,而不是“另一套错误系统”。

Index

Constants

This section is empty.

Variables

View Source
var (
	New    = errors.New
	Is     = errors.Is
	As     = errors.As
	Unwrap = errors.Unwrap
	Join   = errors.Join
)

标准库函数再导出,便于组件统一从 xerrors 使用 errors 能力。

Functions

func Combine

func Combine(errs ...error) error

Combine 将多个错误合并为一个。

规则如下:

  • 全为 nil 时返回 nil
  • 仅有一个非 nil 错误时直接返回该错误
  • 多个非 nil 错误时返回 *MultiError

func GetCode

func GetCode(err error) string

GetCode 从错误链中提取错误码。

若错误链中存在多个 CodedError,返回 errors.As 命中的第一个。

func Must

func Must[T any](v T, err error) T

Must 如果 err 不为 nil,则 panic。仅用于初始化阶段。

func MustOK

func MustOK[T any](v T, ok bool) T

MustOK 如果 ok 为 false,则 panic。

func WithCode

func WithCode(err error, code string) error

WithCode 用错误码包装错误。

当前的 code 模型非常轻量,只包含一个字符串错误码,不承担更复杂的错误元数据职责。 WithCode(nil, code) 会返回 nil。

func Wrap

func Wrap(err error, msg string) error

Wrap 用上下文信息包装错误,保留错误链。

Wrap(nil, msg) 会返回 nil,这样调用方可以在 if err != nil 分支里直接返回。

func Wrapf

func Wrapf(err error, format string, args ...any) error

Wrapf 用格式化的上下文信息包装错误。

Wrapf(nil, format, args...) 会返回 nil。

Types

type CodedError

type CodedError struct {
	Code  string
	Cause error
}

CodedError 表示带有机器可读错误码的错误。

一般建议通过 WithCode 构造,而不是直接初始化该结构体。

func (*CodedError) Error

func (e *CodedError) Error() string

func (*CodedError) Unwrap

func (e *CodedError) Unwrap() error

type Collector

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

Collector 收集多个错误,但只保留第一个非 nil 错误。

它适合顺序执行的多步骤校验流程,不是并发安全的错误聚合器。

func (*Collector) Collect

func (c *Collector) Collect(err error)

Collect 收集一个错误;若 c 已经保存了第一个错误,则后续错误会被忽略。

func (*Collector) Err

func (c *Collector) Err() error

Err 返回已收集到的第一个错误;若从未收集到非 nil 错误,则返回 nil。

type MultiError

type MultiError struct {
	Errors []error
}

MultiError 表示多个错误的集合。

它实现 Unwrap() []error,因此兼容 errors.Is / errors.As 多错误匹配语义。

func (*MultiError) Error

func (m *MultiError) Error() string

func (*MultiError) Unwrap

func (m *MultiError) Unwrap() []error

Unwrap 返回内部错误切片,供 errors.Is / errors.As 遍历匹配。

Jump to

Keyboard shortcuts

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