Возврат ошибки из HandlerFunc - нужен новый тип - PullRequest
0 голосов
/ 27 октября 2018

Прямо сейчас у меня есть это:

type AppError struct{
   Status int
   Message string
}

func (h NearbyHandler) makeUpdate(v NearbyInjection) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {

        item, ok := v.Nearby[params["id"]]

        if !ok {
            return AppError{
                500, "Missing item in map.",
            }
        }

   }
}

проблема в том, что если я сделаю это:

func (h NearbyHandler) makeUpdate(v NearbyInjection) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) AppError { // <<< return AppError

    }
}

, это не скомпилирует b / c http.HandlerFunc невернуть функцию, которая возвращает AppError.

Другой вопрос, который у меня возникает, как мне избежать явного возврата nil, если я использую AppError в качестве возвращаемого значения?

Обратите внимание, что я получаю эту ошибку:

не может использовать литерал func (тип func (http.ResponseWriter, * http.Request) AppError) в качестве типа http.HandlerFunc в возвращаемом аргументе

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

, который не будет компилироваться b / c http.HandlerFunc не возвращает функцию, которая возвращает AppError.

Почему вы не обрабатываете ошибку непосредственно в методе makeUpdate?


как мне избежать явного возврата nil, если я использую AppError в качестве возвращаемого значения?

Невозможно использовать 'nil' в качестве типа AppError в аргументе возврата, вы можетеиспользуйте начальное значение , например:

func test() AppError {
    ret := AppError{
        200, "OK",
    }

    condition := true // some condition
    if !condition {
        ret.Status = 500
        ret.Message = "internal error"
    }
    return ret
}
0 голосов
/ 28 октября 2018

Таким образом, вместо того, чтобы возвращать статус для запроса, дизайнеры go дают вам ResponseWriter . Это ваше основное взаимодействие с клиентом. Например, чтобы установить код состояния, выполните WriteHeader(500).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...