Каждый Go-разработчик знаком с этим паттерном — создание обёрток для ошибок с дублированием метаданных:
func (*SomeObject) SomeMethod(val any) error {
if err := otherMethod(val); err != nil {
return fmt.Errorf("otherMethod %w with val %v", err, val)
}
return nil
}
Проблемы такого подхода:
- Дублирование названий методов в сообщениях об ошибках
- Ручное добавление метаданных (аргументы, переменные) в каждое место
- Сложность отслеживания места возникновения ошибки при нескольких точках выхода
- Засорение кода — повторяющийся boilerplate
- Отсутствие структуры — все метаданные упакованы в одной строке
Что если объединить мощь структурированного логирования (slog
) с автоматическим сбором локального стека вызовов. Результат — чистый код и информативные логи.