Функция errors.Unwrap
Функция errors.Unwrap извлекает следующую ошибку из цепочки вложенных ошибок. Она принимает один параметр - ошибку err, которая может содержать внутри себя другую ошибку. Функция возвращает внутреннюю ошибку, если она существует, и nil, если ошибка не содержит вложенной ошибки или сама равна nil. Эта функция особенно полезна при работе с цепочками ошибок, созданными с помощью оператора %w в fmt.Errorf или с помощью пользовательских типов, реализующих интерфейс Unwrapper.
Синтаксис
errors.Unwrap(err)
Пример
Давайте создадим цепочку из двух ошибок и извлечем внутреннюю ошибку с помощью errors.Unwrap:
package main
import (
"errors"
"fmt"
)
func main() {
innerErr := errors.New("inner error")
outerErr := fmt.Errorf("outer error: %w", innerErr)
unwrappedErr := errors.Unwrap(outerErr)
fmt.Println(unwrappedErr)
}
Результат выполнения кода:
"inner error"
Пример
Давайте проверим, что функция возвращает nil, если ошибка не содержит вложенной ошибки:
package main
import (
"errors"
"fmt"
)
func main() {
err := errors.New("simple error")
unwrappedErr := errors.Unwrap(err)
fmt.Println(unwrappedErr)
}
Результат выполнения кода:
<nil>
Пример
Давайте создадим пользовательский тип ошибки, реализующий метод Unwrap, и проверим работу errors.Unwrap с ним:
package main
import (
"errors"
"fmt"
)
type customError struct {
msg string
err error
}
func (e *customError) Error() string {
return e.msg
}
func (e *customError) Unwrap() error {
return e.err
}
func main() {
innerErr := errors.New("inner error")
outerErr := &customError{
msg: "custom error",
err: innerErr,
}
unwrappedErr := errors.Unwrap(outerErr)
fmt.Println(unwrappedErr)
}
Результат выполнения кода:
"inner error"
Смотрите также
-
функцию
errors.Is,
которая проверяет, содержит ли цепочка ошибок целевую ошибку -
функцию
errors.As,
которая находит первую ошибку в цепочке, соответствующую целевому типу -
функцию
errors.Join,
которая объединяет несколько ошибок в одну -
конструкцию
%w,
которая позволяет вложить одну ошибку в другую при форматировании