Sobes.tech
Back to questions
Senior
4

Что такое errors.Is и errors.As, для чего нужны и какую проблему решают?

Companies where asked
Магнум

Answer from AI

sobes.tech AI

В Go пакете errors функции errors.Is и errors.As предназначены для удобной работы с цепочками ошибок и их типами.

  • errors.Is(err, target error) bool проверяет, содержит ли ошибка err или любая ошибка в её цепочке ошибку, равную target. Это полезно, когда ошибки оборачиваются (wrap) и нужно проверить конкретный тип или значение ошибки.

  • errors.As(err, &target) пытается привести ошибку err или любую ошибку в её цепочке к типу, указанному в target (указатель на переменную ошибки). Если приведение успешно, возвращает true и записывает ошибку в target. Это позволяет работать с конкретными типами ошибок, даже если они обернуты.

Проблема, которую решают эти функции — удобное и безопасное распознавание и обработка ошибок, которые могут быть обернуты несколькими слоями, без необходимости вручную распаковывать цепочку ошибок.

Пример:

if errors.Is(err, os.ErrNotExist) {
    // Обработка ошибки "файл не существует"
}

var pathErr *os.PathError
if errors.As(err, &pathErr) {
    fmt.Println("Ошибка с путем файла:", pathErr.Path)
}