Golang HTTP服务器的恐慌恢复中间件

250 阅读1分钟

你可以使用下面的例子来恢复恐慌,让你的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)}