Обработка ошибок промежуточного программного обеспечения - преобразование ошибки в строку для ответа - PullRequest
0 голосов
/ 26 октября 2018

У меня есть этот middleware func:

func errorMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if err := recover(); err != nil {
                log.Error("Caught error in defer/recover middleware: ", err)
                w.WriteHeader(http.StatusInternalServerError)
                json.NewEncoder(w).Encode(struct {
                    ID string
                }{
                    err.Error(),
                })
            }
        }()
        next.ServeHTTP(w, r)
    })
}

Я использую его так:

router := mux.NewRouter()
router.Use(errorMiddleware)

однако я получаю ошибку компиляции, он говорит:

enter image description here

Кто-нибудь знает, что это такое?Я просто пытаюсь преобразовать ошибку в строку, в конечном итоге, сериализовать ее для клиента и т. Д.

1 Ответ

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

recover() возвращает интерфейс без методов для прокси любого значения, отправленного panic().В блоке defer вы пытаетесь получить доступ к методу Error() чистого интерфейса, в котором нет метода.Если вы хотите различить встроенный тип ошибки, вам нужно установить его тип следующим образом:

realErr, ok := err.(error)
if ok {
    // here you can use realErr.Error().
}

, чтобы получить реальное значение типа error.Если вы посмотрите на встроенные типы , вы увидите, что error предназначен для реализации метода Error() string.

Утверждения типа: https://tour.golang.org/methods/15

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