go-clean-template icon indicating copy to clipboard operation
go-clean-template copied to clipboard

Обработка ошибок

Open Fristorg97 opened this issue 2 years ago • 1 comments

Возникают ситуации когда в обработчик (handler) в результате выполнения логики приложения возвращается ошибка, которая опознаётся и обрабатывается соответствующим образом.

Где лучше хранить кастомные ошибки(унифицированные тексты ошибки. Например: ошибка валидации)? В отедльном пакете, или рядом с энтити или юзкейсом?

Хэндлер зачастую возвращает с описанием ошибки её код (унифицированное представление ошибки в виде строки, для обработки на клиенте отдельных случаев(ошибка валидации логина и т.п)). Код возвращаемой ошибки представлен в виде константы. Где хранить эту константу, рядом с хэндлером или на более глубоком уровне?

В примерах не очень сильно раскрыта ситуация хранения кастомных ошибок. Удобней ли их хранить в отдельном пакете или рядом с местом где используется?

Fristorg97 avatar Aug 26 '23 20:08 Fristorg97

Приветсвую!

Хранение кастомных ошибок и констант для кодов ошибок зависит от структуры проекта и предпочтений команды. Но пару рекомендаций касательно ошибок и кодов могу описать:

  • Если ошибки/коды специфичны для определенного пакета или модуля, храните их рядом с этим пакетом или модулем.
  • Если ошибки/коды используются в нескольких местах, создайте отдельный пакет для ошибок, например, 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)
    }
   ...
}

Таким образом, вы можете централизованно управлять ошибками и кодами ошибок, что упрощает их использование и поддержку.

soltanoff avatar Mar 09 '25 18:03 soltanoff