Функция errors.As
Функция errors.As проверяет, является ли ошибка
или любая из обернутых в ней ошибок (с помощью fmt.Errorf
с директивой %w) ошибкой определенного типа.
В первый параметр мы передаем ошибку для проверки,
во второй параметр мы передаем указатель на переменную
целевого типа, в которую будет сохранена найденная ошибка.
Функция возвращает true, если ошибка найдена,
и false в противном случае.
Синтаксис
errors.As(err, &target)
Пример
Давайте проверим, является ли ошибка типа *os.PathError:
package 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")
}
}
Результат выполнения кода:
"Found path error: nonexistent.txt"
Пример
Давайте проверим, является ли ошибка типом *MyError
после обертывания:
package 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")
}
}
Результат выполнения кода:
"Found MyError: something went wrong"
Смотрите также
-
функцию
errors.Is,
которая проверяет наличие конкретной ошибки в цепочке -
функцию
errors.New,
которая создает новую ошибку с текстовым сообщением -
функцию
errors.Unwrap,
которая возвращает вложенную ошибку -
функцию
errors.Join,
которая объединяет несколько ошибок в одну