Все вопросы

15 Функции

Как в Go принято обрабатывать ошибки?

Ошибка — это значение интерфейса error, а не исключение. Функция возвращает её последним результатом, вызывающий сразу проверяет if err != nil. Контекст добавляют обёрткой fmt.Errorf("запись %d: %w", id, err), а потом узнают исходную ошибку через errors.Is.

%w сохраняет цепочку, чтобы errors.Is и errors.As могли её развернуть. %v превращает ошибку в текст и цепочку рвёт.

Сентинел вроде errNotFound объявляют через errors.New и сравнивают по идентичности, а не по тексту сообщения.

Пример

Go

обёртка и errors.Is

package main

import (
    "errors"
    "fmt"
)

var errNotFound = errors.New("не найдено")

func load(id int) error {
    if id == 0 {
        return fmt.Errorf("запись %d: %w", id, errNotFound)
    }
    return nil
}

func main() {
    err := load(0)
    fmt.Println(err)
    fmt.Println(errors.Is(err, errNotFound))
}