Функция errors.As

Функция errors.As проверяет, является ли ошибка или любая из обернутых в ней ошибок (с помощью fmt.Errorf с директивой %w) ошибкой определенного типа. В первый параметр мы передаем ошибку для проверки, во второй параметр мы передаем указатель на переменную целевого типа, в которую будет сохранена найденная ошибка. Функция возвращает true, если ошибка найдена, и false в противном случае.

Синтаксис

goerrors.As(err, &target)

Пример

Давайте проверим, является ли ошибка типа *os.PathError:

gopackage main

import (
  "errors"
  "fmt"
  "os"
)

func main() {
  _, err := os.Open("nonexistent.txt")
  var pathErr *os.PathError
  if errors.As(err, &pathErr) {
    fmt.Println("Found path error:", pathErr.Path)
  } else {
    fmt.Println("Not a path error")
  }
}

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

go"Found path error: nonexistent.txt"

Пример

Давайте проверим, является ли ошибка типом *MyError после обертывания:

gopackage main

import (
  "errors"
  "fmt"
)

type MyError struct {
  Message string
}

func (e *MyError) Error() string {
  return e.Message
}

func main() {
  baseErr := &MyError{Message: "something went wrong"}
  wrappedErr := fmt.Errorf("wrapped error: %w", baseErr)

  var myErr *MyError
  if errors.As(wrappedErr, &myErr) {
    fmt.Println("Found MyError:", myErr.Message)
  } else {
    fmt.Println("MyError not found")
  }
}

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

go"Found MyError: something went wrong"

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

  • функцию errors.Is,
    которая проверяет наличие конкретной ошибки в цепочке
  • функцию errors.New,
    которая создает новую ошибку с текстовым сообщением
  • функцию errors.Unwrap,
    которая возвращает вложенную ошибку
  • функцию errors.Join,
    которая объединяет несколько ошибок в одну