Handling panic elegantly:
package main
import (
"fmt"
"log"
"net/http"
)
func handle() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
panic("i am panic")
}
}
func handlePanic(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
defer func() {
if i := recover(); i != nil {
log.Printf("panic at %s: %v", r.URL.Path, i)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprint(w, http.StatusText(http.StatusInternalServerError))
}
}()
next(w, r)
}
}
func main() {
http.ListenAndServe(":8000", handlePanic(handle()))
}
Top comments (0)