我有这个中间件功能:
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)
但是我遇到编译错误,它说:
有人知道这是怎么回事吗?我只是想将err转换为字符串,最终将其序列化为客户端等。
答案 0 :(得分:3)
recover()
返回的接口没有方法来代理panic()
发送的任何值。在defer块中,您尝试访问纯净的,没有方法的接口的Error()
方法。如果要区分内置错误类型,则必须断言其类型,例如:
realErr, ok := err.(error)
if ok {
// here you can use realErr.Error().
}
这样它将为您提供error
类型的真实值。如果您检出built-in types,将会看到error
是要实现Error() string
方法。