errorx

package module
v1.1.7 Latest Latest
Warning

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

Go to latest
Published: Jul 16, 2025 License: MIT Imports: 4 Imported by: 2

README

errorx

errorx — простой и удобный пакет для создания обёрток ошибок с читаемым префиксом и структурированными аргументами в стиле контекстного логирования.


Основная идея

Пакет предоставляет тип ErrorBuilder, который позволяет добавлять к ошибкам:

  • Читаемый префикс (контекст или описание),
  • Структурированные ключ-значение аргументы (context),
  • Обёртывать исходные ошибки, сохраняя возможность использовать errors.Is, errors.As и errors.Unwrap.

Пример итогового сообщения об ошибке:

prefix: {key1=val1, key2=val2}: original error message

Установка

go get github.com/yourusername/errorx

Использование

import "github.com/yourusername/errorx"

func someFunc() error {
    err := doSomething()
    if err != nil {
        return errorx.NewBuilder("operation failed").
            WithArgs("userID", 42, "retry", true).
            Wrap(err)
    }
    return nil
}

API

Тип ErrorBuilder

Структура для построения обёрнутых ошибок с контекстом.

type ErrorBuilder struct {
    Prefix string  // Префикс ошибки — дополнительный контекст
    Args   []any   // Ключ-значение аргументы контекста: [key1, val1, key2, val2, ...]
}

Конструкторы
  • NewBuilder(prefix string) ErrorBuilder

    Создаёт новый билдер с заданным префиксом.


Методы
  • WithPrefix(prefix string) ErrorBuilder

    Добавляет или расширяет префикс ошибки. Возвращает новый билдера.

  • WithArgs(args ...any) ErrorBuilder

    Добавляет ключ-значение аргументы к ошибке.
    Ключи преобразуются в строки через fmt.Sprintf("%v", key).
    Если для ключа отсутствует значение, используется строка "<missing>".

  • Wrap(err error) error

    Оборачивает переданную ошибку, добавляя префикс и аргументы.
    Если err == nil, возвращает nil.


Пример

err := errors.New("file not found")

wrappedErr := errorx.NewBuilder("ReadFile").
    WithArgs("filename", "config.yaml", "attempt", 3).
    Wrap(err)

fmt.Println(wrappedErr.Error())
// Output:
// ReadFile: {filename=config.yaml, attempt=3}: file not found

Плюсы реализации

  • Простота и удобство: быстро добавляет читаемый контекст к ошибке.
  • Читаемый формат вывода с префиксом и структурированными аргументами.
  • Безопасность: не паникует при неправильных аргументах, подставляет "".
  • Совместимость с error интерфейсом Go: поддерживает errors.Is, errors.As, errors.Unwrap.
  • Минимальные зависимости: вся логика реализована внутри пакета.

Минусы и ограничения

  • Отсутствие типобезопасности аргументов — программно получить ключи/значения нельзя без парсинга строки.
  • Методы используют value semantics, что может быть неочевидно и привести к ошибкам.
  • Формат вывода предназначен только для человекочитаемого логирования, не интегрируется с системами структурированного логирования.
  • Нет поддержки вложенных или многослойных метаданных ошибок.

Когда использовать

  • Для улучшения читаемости ошибок с контекстом.
  • В проектах без необходимости сложного структурированного логирования.
  • Для небольших и средних проектов, где важна простота и совместимость со стандартной библиотекой.

Лицензия

MIT License — смотрите файл LICENSE для подробностей.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ErrorBuilder

type ErrorBuilder struct {
	// Prefix добавляется перед ошибкой в итоговом сообщении.
	Prefix string
	// Args — пары ключ-значение, которые будут добавлены после префикса.
	// Каждый ключ должен иметь соответствующее значение.
	Args []any
}

ErrorBuilder накапливает контекст (префикс и аргументы), который может быть добавлен к ошибке при вызове Wrap.

func Errorf

func Errorf(format string, args ...any) ErrorBuilder

Errorf создает ErrorBuilder с отформатированным сообщением-префиксом.

func NewBuilder

func NewBuilder(msg string) ErrorBuilder

NewBuilder создает новый ErrorBuilder с указанным сообщением-префиксом.

func WithArgs

func WithArgs(args ...any) ErrorBuilder

WithArgs создает ErrorBuilder с указанными парами "ключ-значение". При вызове с нечётным числом аргументов пропущенные значения заменяются на "<missing>". Ключи приводятся к строке с помощью fmt.Sprintf.

func WithFileLine added in v1.1.4

func WithFileLine() ErrorBuilder

WithFileLine создает новый ErrorBuilder с именем файла и номером строки,

func WithFunction added in v1.1.4

func WithFunction() ErrorBuilder

WithFunction создает новый ErrorBuilder с полным именем функции (включая путь пакета).

func WithShortFunction added in v1.1.5

func WithShortFunction() ErrorBuilder

WithShortFunction создает новый ErrorBuilder с именем функции.

func (ErrorBuilder) Errorf

func (b ErrorBuilder) Errorf(format string, a ...any) error

Errorf создает ошибку с отформатированным сообщением и оборачивает её с добавленным контекстом.

Аналогично Wrap(fmt.Errorf(...)).

func (ErrorBuilder) ExtendPrefix

func (b ErrorBuilder) ExtendPrefix(suffix string) ErrorBuilder

ExtendPrefix adds a suffix to the current prefix, forming a longer context chain.

func (ErrorBuilder) New

func (b ErrorBuilder) New(s string) error

New создает ошибку с указанным сообщением и оборачивает её с добавленным контекстом.

Аналогично Wrap(errors.New(s)).

func (ErrorBuilder) WithArgs

func (b ErrorBuilder) WithArgs(args ...any) ErrorBuilder

WithArgs добавляет пары "ключ-значение" в ErrorBuilder. Ключи приводятся к строке через fmt.Sprintf. При нечётном количестве аргументов — последнее значение будет заменено на "<missing>".

func (ErrorBuilder) WithFileLine added in v1.1.2

func (b ErrorBuilder) WithFileLine() ErrorBuilder

func (ErrorBuilder) WithFunction added in v1.1.2

func (b ErrorBuilder) WithFunction() ErrorBuilder

func (ErrorBuilder) WithPrefix

func (b ErrorBuilder) WithPrefix(s string) ErrorBuilder

WithPrefix добавляет префикс к ErrorBuilder. Повторные вызовы добавляют новый текст перед уже существующим через ": ".

func (ErrorBuilder) WithShortFunction added in v1.1.5

func (b ErrorBuilder) WithShortFunction() ErrorBuilder

func (ErrorBuilder) Wrap

func (b ErrorBuilder) Wrap(err error) error

Wrap оборачивает переданную ошибку с добавленным префиксом и аргументами.

Поведение:

  • Если err == nil, метод немедленно возвращает nil и ничего не делает;
  • Если задан Prefix, он добавляется перед ошибкой через ": ";
  • Если заданы аргументы, они добавляются в фигурных скобках после префикса, ключ=значение разделены запятыми;
  • Финальный формат: "<Prefix>: {key1=val1, key2=val2}: оригинальная ошибка".

Пример:

err := NewBuilder("context").WithArgs("user", 42).Wrap(someErr)
// context: {user=42}: someErr

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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