Краткое описание библиотеки
Создание типов
Для создания типа используется функция 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
.
Описание
Простая библиотека для создания типов ошибок и взаимодействия с ними