Вопрос с собеседования · Go

Как создавать свои ошибки в Go — сигнальные ошибки и типы ошибок?

JuniorОшибки и panic
Ещё спрашивают так:
  • Что такое sentinel error?
  • Как сделать свой тип ошибки в Go?
Коротко

Сигнальная ошибка — переменная пакета var ErrNotFound = errors.New("not found"): вызывающий проверяет её через errors.Is. Тип ошибки — структура с методом Error() string, когда нужно передать данные (поле, код, id): проверяют через errors.As. Добавлять контекст при возврате вверх — fmt.Errorf("загрузка заказа %d: %w", id, err). Сообщения — со строчной буквы и без точки, потому что их склеивают в цепочки.

  • Не сравнивать текст ошибки строками — он может измениться
  • Ошибку либо обрабатывают, либо возвращают с контекстом — не логируют на каждом уровне
  • Возвращать именно nil, а не типизированный nil-указатель

А ещё Сигнальные ошибки — часть API пакета: менять их — ломать вызывающих

Подробно

Пример:

var ErrNotFound = errors.New("order not found")

type ValidationError struct{ Field string }
func (e *ValidationError) Error() string { return "invalid " + e.Field }

func Load(id int) (*Order, error) {
    o, err := repo.Get(id)
    if err != nil {
        return nil, fmt.Errorf("load order %d: %w", id, err)
    }
    return o, nil
}

// у вызывающего
if errors.Is(err, ErrNotFound) { /* 404 */ }
var ve *ValidationError
if errors.As(err, &ve) { /* 400, поле ve.Field */ }

Что хотят услышать

  • Сигнальные ошибки и errors.Is.
  • Типы ошибок и errors.As.
  • Обёртка с %w.
  • Не сравнивать строки.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Проверять ошибку сравнением err.Error() с ожидаемой строкой — это самый надёжный способ
  • ✓Сигнальные ошибки проверяют errors.Is, типы ошибок — errors.As
  • ✗Свои ошибки в Go создают только через panic
  • ✗fmt.Errorf с %v сохраняет цепочку для errors.Is

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования