Golang web 项目中实现自定义 recovery 中间件
package main
import (
"log"
"net/http"
)
// 自定义的recovery处理函数
func customRecoveryHandler(w http.ResponseWriter, r *http.Request, recoverVal interface{}) {
log.Printf("自定义recovery: 捕获到panic - %v\n", recoverVal)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
}
// 自定义recovery中间件
func CustomRecovery() func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
customRecoveryHandler(w, r, err)
}
}()
next.ServeHTTP(w, r)
})
}
}
func main() {
// 使用自定义recovery中间件
handler := CustomRecovery()(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
panic("故意触发一个panic")
}))
http.Handle("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
这段代码定义了一个自定义的recovery处理函数customRecoveryHandler
和一个自定义的recovery中间件CustomRecovery
。在main
函数中,我们使用这个中间件来处理在请求处理中可能发生的panic。如果发生了panic,customRecoveryHandler
会被调用,记录相关信息并向客户端返回一个500内部服务器错误。
评论已关闭