❓ Как создать свою кастомную ошибку в Go
• Пакет errors — самый быстрый способ
Подходит для простых статичных ошибок. Такую переменную удобно объявить один раз и сравнивать через errors.Is.
var ErrNotFound = errors.New("запись не найдена")
• fmt.Errorf() — когда нужен контекст
Позволяет подставить в текст детали. А глагол %w ещё и «оборачивает» исходную ошибку, сохраняя цепочку для errors.Is / errors.Unwrap.
return fmt.Errorf("не удалось загрузить юзера %d: %w", id, ErrNotFound)
• Кастомный тип через struct — максимум гибкости
Нужен, когда к ошибке хочется прикрепить данные (код, поле, статус). Достаточно реализовать метод Error() string — и тип становится ошибкой.
type ValidationError struct {
Field string
Msg string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Msg)
}
Такую ошибку потом можно вытащить через errors.As и прочитать её поля.
🐸 Библиотека Go для собеса
• Пакет errors — самый быстрый способ
Подходит для простых статичных ошибок. Такую переменную удобно объявить один раз и сравнивать через errors.Is.
var ErrNotFound = errors.New("запись не найдена")
• fmt.Errorf() — когда нужен контекст
Позволяет подставить в текст детали. А глагол %w ещё и «оборачивает» исходную ошибку, сохраняя цепочку для errors.Is / errors.Unwrap.
return fmt.Errorf("не удалось загрузить юзера %d: %w", id, ErrNotFound)
• Кастомный тип через struct — максимум гибкости
Нужен, когда к ошибке хочется прикрепить данные (код, поле, статус). Достаточно реализовать метод Error() string — и тип становится ошибкой.
type ValidationError struct {
Field string
Msg string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Msg)
}
Такую ошибку потом можно вытащить через errors.As и прочитать её поля.
🐸 Библиотека Go для собеса