Обработка ошибок
Возникают ситуации когда в обработчик (handler) в результате выполнения логики приложения возвращается ошибка, которая опознаётся и обрабатывается соответствующим образом.
Где лучше хранить кастомные ошибки(унифицированные тексты ошибки. Например: ошибка валидации)? В отедльном пакете, или рядом с энтити или юзкейсом?
Хэндлер зачастую возвращает с описанием ошибки её код (унифицированное представление ошибки в виде строки, для обработки на клиенте отдельных случаев(ошибка валидации логина и т.п)). Код возвращаемой ошибки представлен в виде константы. Где хранить эту константу, рядом с хэндлером или на более глубоком уровне?
В примерах не очень сильно раскрыта ситуация хранения кастомных ошибок. Удобней ли их хранить в отдельном пакете или рядом с местом где используется?
Приветсвую!
Хранение кастомных ошибок и констант для кодов ошибок зависит от структуры проекта и предпочтений команды. Но пару рекомендаций касательно ошибок и кодов могу описать:
- Если ошибки/коды специфичны для определенного пакета или модуля, храните их рядом с этим пакетом или модулем.
- Если ошибки/коды используются в нескольких местах, создайте отдельный пакет для ошибок, например,
internal/errors/internal/errorcodes.
Пример файла internal/errorcodes/errorcodes.go:
package errorcodes
const (
CodeValidationError = "VALIDATION_ERROR"
CodeNotFoundError = "NOT_FOUND"
...
)
Пример использования в хэндлере:
package v1
...
func (r *translationRoutes) doTranslate(ctx *fiber.Ctx) error {
var request doTranslateRequest
if err := ctx.BodyParser(&request); err != nil {
r.l.Error(err, "http - v1 - doTranslate")
return errorResponse(ctx, http.StatusBadRequest, errorcodes.CodeValidationError)
}
if err := r.v.Struct(request); err != nil {
r.l.Error(err, "http - v1 - doTranslate")
return errorResponse(ctx, http.StatusBadRequest, errorcodes.CodeValidationError)
}
...
}
Таким образом, вы можете централизованно управлять ошибками и кодами ошибок, что упрощает их использование и поддержку.