Julien's dev blog

Go HTTP panic recovery middleware

A simple Go HTTP panic recovery middleware implemention.

Last updated on: 2024-12-29

package httpmux

import "net/http"

type PanicRecoveryHandler func(w http.ResponseWriter, r *http.Request, err any)

func NewPanicRecoveryMiddleware(onPanic PanicRecoveryHandler) Middleware {
	if onPanic == nil {
		onPanic = func(_ http.ResponseWriter, _ *http.Request, err any) { panic(err) }
	}

	return func(h http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			defer func() {
				if err := recover(); err != nil {
					onPanic(w, r, err)
				}
			}()
			h.ServeHTTP(w, r)
		})
	}
}