Промежуточное по для обработки ошибок - преобразование ошибки в строку для ответа

У меня есть эта функция промежуточного программного обеспечения:

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

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

0
0
98
1

Ответы 1

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

Другие вопросы по теме