Вопрос с собеседования · 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 минут бесплатно.