你可以使用下面的例子来恢复恐慌,让你的HTTP服务器继续为请求提供服务,否则它将崩溃。任何恐慌都是一种内部错误,所以在这种情况下我们会返回500 。
中间件
如果你故意在你的一个端点中造成恐慌,并调用它,你会看到响应将是500 Internal Server Error :
package pkg
import (
"net/http"
)
func PanicRecovery(handler http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, rq *http.Request) {
defer func() {
if err := recover(); err != nil {
log.Error(err)
// To avoid 'superfluous response.WriteHeader call' error
if rw.Header().Get("Content-Type") == "" {
rw.WriteHeader(http.StatusInternalServerError)
}
}
}()
handler.ServeHTTP(rw, rq)
})
}
return &http.Server{Addr: ":8080", Handler: pkg.PanicRecovery(yourRouter)}