README.md

Краткое описание библиотеки

Создание типов

Для создания типа используется функция func NewType(info string) *Type:

import "gitflic.ru/project/education/errors"

var (
    ErrNotFound = errors.NewType("not found")
    ErrNoRights = errors.NewType("no rights")
)

Создание экземпляров ошибки

Для создания экземпляра ошибки определенного типа, необходимо использовать метод типа ошибки func (t *Type) New(info string) *Instance:

import (
    "log"
    "gitflic.ru/project/education/errors"
)
...
err := ErrNotFound.New("not found user by id")
...

log.Println(err.Error()) // "not found user by id"

Для создания экземпляра ошибки с текстом по умолчанию (переданным в качестве аргумента при создании типа ошибки) используется функция func (t *Type) NewDefault() *Instance

import (
    "log"
    "gitflic.ru/project/education/errors"
)
...
err := ErrNotFound.NewDefault()
...
log.Println(err.Error()) // "not found"

Вложенные ошибки

Чтобы “завернуть” одну ошибку в другую, нужно использовать функцию func Wrap(err error, wrapper *Instance) *Instance или метод типа Instance func (i *Instance) Wrap(err error) *Instance. Для примера:

err := Foo()
if err != nil {
    return nil, errors.Wrap(err, ErrNotFound.New("not found user"))
}

или:

err := Foo()
if err != nil {
    return nil, ErrNotFound.New("not found user").Wrap(err)
}

Для распаковки следует использовать функцию func Unwrap(err error) error:

err := Foo() 
nestedError := errors.Unwrap(err)

Функция возвращает внутреннюю ошибку или nil Если вы уверены, что объект, реализующий тип error, с которым вы имеет дело, это указатель на объект типа Instance, вы можете использовать метод этого типа: func (i *Instance) Unwrap() error

err := Foo() // func Foo() *Instance
nestedError := err.Unwrap()

Идентификация ошибок

Для определения типа полученной ошибки, используется функция func TypeIs(err error, t *Type) bool

err := Foo() // func Foo() error
if errors.TypeIs(err, ErrNotFound) {
    // do something
}

Если вы уверены, что объект, реализующий тип error, с которым вы имеет дело, это указатель на объект типа Instance, вы можете использовать метод этого типа: func (i *Instance) TypeIs(t *Type) bool

err := Foo() // func Foo() *Instance
if err.TypeIs(ErrNotFound) {
    // do something
}

Для того, чтобы определить, есть ли в стеке ошибок, ошибка определенного типа, можно использовать функцию func Has(err error, t *Type) bool

err := Foo() // func Foo() error
if errors.Has(err, ErrNotFound) {
    // do something
}

Эта функция, циклично, проверяет все вложенные ошибки (если они есть) на принодлежность к указанному типу. Если найдено совпадение, функция возвращает true. Так же в этом пакете реализована функция func Is(err, target error) bool.

Описание

Простая библиотека для создания типов ошибок и взаимодействия с ними

Конвейеры
0 успешных
0 с ошибкой