我有这个中间件功能:
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 转换为字符串,最终为客户端等序列化它。
最佳答案
recover()
返回一个没有方法的接口(interface)来代理 panic()
发送的任何值。在 defer block 中,您试图访问一个纯无方法接口(interface)的 Error()
方法。如果你想区分内置错误类型,你必须像这样断言它的类型:
realErr, ok := err.(error)
if ok {
// here you can use realErr.Error().
}
这样它就会给你一个类型为 error
的真实值。如果你查看 built-in types ,你会看到error
是实现了一个Error() string
方法。
关于go - 错误处理中间件 - 将 err 转换为字符串以进行响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53002131/