15 Функции
Как в Go принято обрабатывать ошибки?
Ответ
Ошибка — это значение интерфейса error, а не исключение. Функция возвращает её последним результатом, вызывающий сразу проверяет if err != nil. Контекст добавляют обёрткой fmt.Errorf("запись %d: %w", id, err), а потом узнают исходную ошибку через errors.Is.
Подробнее
%w сохраняет цепочку, чтобы errors.Is и errors.As могли её развернуть. %v превращает ошибку в текст и цепочку рвёт.
Сентинел вроде errNotFound объявляют через errors.New и сравнивают по идентичности, а не по тексту сообщения.
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))
}