Функция errors.Unwrap

Функция errors.Unwrap извлекает следующую ошибку из цепочки вложенных ошибок. Она принимает один параметр - ошибку err, которая может содержать внутри себя другую ошибку. Функция возвращает внутреннюю ошибку, если она существует, и nil, если ошибка не содержит вложенной ошибки или сама равна nil. Эта функция особенно полезна при работе с цепочками ошибок, созданными с помощью оператора %w в fmt.Errorf или с помощью пользовательских типов, реализующих интерфейс Unwrapper.

Синтаксис

goerrors.Unwrap(err)

Пример

Давайте создадим цепочку из двух ошибок и извлечем внутреннюю ошибку с помощью errors.Unwrap:

gopackage 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)
}

Результат выполнения кода:

go"inner error"

Пример

Давайте проверим, что функция возвращает nil, если ошибка не содержит вложенной ошибки:

gopackage main

import (
  "errors"
  "fmt"
)

func main() {
  err := errors.New("simple error")
  unwrappedErr := errors.Unwrap(err)
  fmt.Println(unwrappedErr)
}

Результат выполнения кода:

go<nil>

Пример

Давайте создадим пользовательский тип ошибки, реализующий метод Unwrap, и проверим работу errors.Unwrap с ним:

gopackage 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)
}

Результат выполнения кода:

go"inner error"

Смотрите также

  • функцию errors.Is,
    которая проверяет, содержит ли цепочка ошибок целевую ошибку
  • функцию errors.As,
    которая находит первую ошибку в цепочке, соответствующую целевому типу
  • функцию errors.Join,
    которая объединяет несколько ошибок в одну
  • конструкцию %w,
    которая позволяет вложить одну ошибку в другую при форматировании