diff --git a/router.go b/router.go index 294dbecd..009af3cf 100644 --- a/router.go +++ b/router.go @@ -368,8 +368,8 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) if _, ok := err.(middleware.HTTPException); ok { // catch intented errors, only for HTTP 4XX and 5XX } else { - errstr := fmt.Sprint(err) - if handler, ok := middleware.ErrorMaps[errstr]; ok && ErrorsShow { + handler := p.getErrorHandler(fmt.Sprint(err)) + if ErrorsShow { handler(rw, r) } else { if !RecoverPanic { @@ -865,6 +865,24 @@ Admin: } } +// there always should be error handler that sets error code accordingly for all unhandled errors +// in order to have custom UI for error page it's necessary to override "500" error +func (p *ControllerRegistor) getErrorHandler(errorCode string) func(rw http.ResponseWriter, r *http.Request) { + handler := middleware.SimpleServerError + ok := true + if errorCode != "" { + handler, ok = middleware.ErrorMaps[errorCode] + if !ok { + handler, ok = middleware.ErrorMaps["500"] + } + if !ok || handler == nil { + handler = middleware.SimpleServerError + } + } + + return handler +} + //responseWriter is a wrapper for the http.ResponseWriter //started set to true if response was written to then don't execute other handler type responseWriter struct {