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

时间:2018-10-26 05:38:55

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

1 个答案:

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

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