Skip to content

Commit 0c96a20

Browse files
Stop useless panicking in context and render (#2150)
Co-authored-by: Bo-Yi Wu <[email protected]>
1 parent 153b229 commit 0c96a20

File tree

4 files changed

+16
-19
lines changed

4 files changed

+16
-19
lines changed

context.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,9 @@ func (c *Context) Render(code int, r render.Render) {
924924
}
925925

926926
if err := r.Render(c.Writer); err != nil {
927-
panic(err)
927+
// Pushing error to c.Errors
928+
_ = c.Error(err)
929+
c.Abort()
928930
}
929931
}
930932

context_test.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import (
3232

3333
var _ context.Context = (*Context)(nil)
3434

35+
var errTestRender = errors.New("TestRender")
36+
3537
// Unit tests TODO
3638
// func (c *Context) File(filepath string) {
3739
// func (c *Context) Negotiate(code int, config Negotiate) {
@@ -643,25 +645,21 @@ func TestContextBodyAllowedForStatus(t *testing.T) {
643645
assert.True(t, true, bodyAllowedForStatus(http.StatusInternalServerError))
644646
}
645647

646-
type TestPanicRender struct{}
648+
type TestRender struct{}
647649

648-
func (*TestPanicRender) Render(http.ResponseWriter) error {
649-
return errors.New("TestPanicRender")
650+
func (*TestRender) Render(http.ResponseWriter) error {
651+
return errTestRender
650652
}
651653

652-
func (*TestPanicRender) WriteContentType(http.ResponseWriter) {}
654+
func (*TestRender) WriteContentType(http.ResponseWriter) {}
653655

654-
func TestContextRenderPanicIfErr(t *testing.T) {
655-
defer func() {
656-
r := recover()
657-
assert.Equal(t, "TestPanicRender", fmt.Sprint(r))
658-
}()
656+
func TestContextRenderIfErr(t *testing.T) {
659657
w := httptest.NewRecorder()
660658
c, _ := CreateTestContext(w)
661659

662-
c.Render(http.StatusOK, &TestPanicRender{})
660+
c.Render(http.StatusOK, &TestRender{})
663661

664-
assert.Fail(t, "Panic not detected")
662+
assert.Equal(t, errorMsgs{&Error{Err: errTestRender, Type: 1}}, c.Errors)
665663
}
666664

667665
// Tests that the response is serialized as JSON

render/json.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,8 @@ var (
5353
)
5454

5555
// Render (JSON) writes data with custom ContentType.
56-
func (r JSON) Render(w http.ResponseWriter) (err error) {
57-
if err = WriteJSON(w, r.Data); err != nil {
58-
panic(err)
59-
}
60-
return
56+
func (r JSON) Render(w http.ResponseWriter) error {
57+
return WriteJSON(w, r.Data)
6158
}
6259

6360
// WriteContentType (JSON) writes JSON ContentType.

render/render_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ func TestRenderJSON(t *testing.T) {
4040
assert.Equal(t, "application/json; charset=utf-8", w.Header().Get("Content-Type"))
4141
}
4242

43-
func TestRenderJSONPanics(t *testing.T) {
43+
func TestRenderJSONError(t *testing.T) {
4444
w := httptest.NewRecorder()
4545
data := make(chan int)
4646

4747
// json: unsupported type: chan int
48-
assert.Panics(t, func() { assert.NoError(t, (JSON{data}).Render(w)) })
48+
assert.Error(t, (JSON{data}).Render(w))
4949
}
5050

5151
func TestRenderIndentedJSON(t *testing.T) {

0 commit comments

Comments
 (0)