go - 错误处理中间件 - 将 err 转换为字符串以进行响应

标签 go

我有这个中间件功能:

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 转换为字符串,最终为客户端等序列化它。

最佳答案

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方法。

类型断言:https://tour.golang.org/methods/15

关于go - 错误处理中间件 - 将 err 转换为字符串以进行响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53002131/

相关文章:

go - 如何使路径 "/"不匹配 Golang net/http 中所有其他不匹配的路径

go - 未检测到 Vault Token Helper?

go - 从大文件中删除特定行的最快方法是什么?

sql - Golang、数据库/sql、Postgres - 在您需要结果时使用 QueryRow 和 INSERT 不良做法?

regex - 如何在字符之间查找和替换

go - OpenGL 和 SDL2 无法打开窗口

arrays - golang : convert uint32 (or any built-in type) to []byte (to be written in a file)

regex - 如何迭代正则表达式匹配组

mongodb - Mgo 是否缓存连接字符串?

go - 接受通用结构的函数