You can use example below to recover from panic and let your HTTP server carry on serving requests otherwise it will crash. Any panic is a kind of internal error so we will return 500 response in such case.


If you cause a panic on purpose in one of your endpoints and call it, you will see that the response will be 500 Internal Server Error.

package pkg

import (

func PanicRecovery(handler http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, rq *http.Request) {
defer func() {
if err := recover(); err != nil {

// To avoid 'superfluous response.WriteHeader call' error
if rw.Header().Get("Content-Type") == "" {

handler.ServeHTTP(rw, rq)

return &http.Server{Addr: ":8080", Handler: pkg.PanicRecovery(yourRouter)}