diff --git a/context.go b/context.go index d69df70b24..d4eb9378cc 100644 --- a/context.go +++ b/context.go @@ -884,18 +884,16 @@ func (c *Context) Cookie(name string) (string, error) { } // Render writes the response headers and calls render.Render to render data. -func (c *Context) Render(code int, r render.Render) { +func (c *Context) Render(code int, r render.Render) error { c.Status(code) if !bodyAllowedForStatus(code) { r.WriteContentType(c.Writer) c.Writer.WriteHeaderNow() - return + return nil } - if err := r.Render(c.Writer); err != nil { - panic(err) - } + return r.Render(c.Writer) } // HTML renders the HTTP template specified by its file name. diff --git a/context_test.go b/context_test.go index 9e02aede13..d4667b71af 100644 --- a/context_test.go +++ b/context_test.go @@ -642,25 +642,18 @@ func TestContextBodyAllowedForStatus(t *testing.T) { assert.True(t, true, bodyAllowedForStatus(http.StatusInternalServerError)) } -type TestPanicRender struct{} +type TestErrorRender struct{} -func (*TestPanicRender) Render(http.ResponseWriter) error { - return errors.New("TestPanicRender") +func (*TestErrorRender) Render(http.ResponseWriter) error { + return errors.New("TestErrorRender") } -func (*TestPanicRender) WriteContentType(http.ResponseWriter) {} +func (*TestErrorRender) WriteContentType(http.ResponseWriter) {} func TestContextRenderPanicIfErr(t *testing.T) { - defer func() { - r := recover() - assert.Equal(t, "TestPanicRender", fmt.Sprint(r)) - }() w := httptest.NewRecorder() c, _ := CreateTestContext(w) - - c.Render(http.StatusOK, &TestPanicRender{}) - - assert.Fail(t, "Panic not detected") + assert.Error(t, c.Render(http.StatusOK, &TestErrorRender{})) } // Tests that the response is serialized as JSON diff --git a/render/json.go b/render/json.go index 3ebcee9706..ac0452e6d5 100644 --- a/render/json.go +++ b/render/json.go @@ -54,10 +54,7 @@ var ( // Render (JSON) writes data with custom ContentType. func (r JSON) Render(w http.ResponseWriter) (err error) { - if err = WriteJSON(w, r.Data); err != nil { - panic(err) - } - return + return WriteJSON(w, r.Data) } // WriteContentType (JSON) writes JSON ContentType. diff --git a/render/render_test.go b/render/render_test.go index e417731a89..20a9c875af 100644 --- a/render/render_test.go +++ b/render/render_test.go @@ -39,12 +39,12 @@ func TestRenderJSON(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type")) } -func TestRenderJSONPanics(t *testing.T) { +func TestRenderJSONError(t *testing.T) { w := httptest.NewRecorder() data := make(chan int) // json: unsupported type: chan int - assert.Panics(t, func() { assert.NoError(t, (JSON{data}).Render(w)) }) + assert.Error(t, (JSON{data}).Render(w)) } func TestRenderIndentedJSON(t *testing.T) {