55f638ac by astaxie

Merge pull request #377 from vadimi/master

Panic template execution errors to show error pages accordingly
2 parents 505fca93 31f862c5
...@@ -138,6 +138,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { ...@@ -138,6 +138,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
138 err := BeeTemplates[c.TplNames].ExecuteTemplate(newbytes, c.TplNames, c.Data) 138 err := BeeTemplates[c.TplNames].ExecuteTemplate(newbytes, c.TplNames, c.Data)
139 if err != nil { 139 if err != nil {
140 Trace("template Execute err:", err) 140 Trace("template Execute err:", err)
141 return nil, err
141 } 142 }
142 tplcontent, _ := ioutil.ReadAll(newbytes) 143 tplcontent, _ := ioutil.ReadAll(newbytes)
143 c.Data["LayoutContent"] = template.HTML(string(tplcontent)) 144 c.Data["LayoutContent"] = template.HTML(string(tplcontent))
...@@ -145,6 +146,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { ...@@ -145,6 +146,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
145 err = BeeTemplates[c.Layout].ExecuteTemplate(ibytes, c.Layout, c.Data) 146 err = BeeTemplates[c.Layout].ExecuteTemplate(ibytes, c.Layout, c.Data)
146 if err != nil { 147 if err != nil {
147 Trace("template Execute err:", err) 148 Trace("template Execute err:", err)
149 return nil, err
148 } 150 }
149 icontent, _ := ioutil.ReadAll(ibytes) 151 icontent, _ := ioutil.ReadAll(ibytes)
150 return icontent, nil 152 return icontent, nil
...@@ -163,6 +165,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { ...@@ -163,6 +165,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
163 err := BeeTemplates[c.TplNames].ExecuteTemplate(ibytes, c.TplNames, c.Data) 165 err := BeeTemplates[c.TplNames].ExecuteTemplate(ibytes, c.TplNames, c.Data)
164 if err != nil { 166 if err != nil {
165 Trace("template Execute err:", err) 167 Trace("template Execute err:", err)
168 return nil, err
166 } 169 }
167 icontent, _ := ioutil.ReadAll(ibytes) 170 icontent, _ := ioutil.ReadAll(ibytes)
168 return icontent, nil 171 return icontent, nil
......
...@@ -26,7 +26,10 @@ const ( ...@@ -26,7 +26,10 @@ const (
26 FinishRouter 26 FinishRouter
27 ) 27 )
28 28
29 var HTTPMETHOD = []string{"get", "post", "put", "delete", "patch", "options", "head"} 29 var (
30 HTTPMETHOD = []string{"get", "post", "put", "delete", "patch", "options", "head"}
31 errorType = reflect.TypeOf((*error)(nil)).Elem()
32 )
30 33
31 type controllerInfo struct { 34 type controllerInfo struct {
32 pattern string 35 pattern string
...@@ -729,7 +732,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) ...@@ -729,7 +732,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request)
729 if !w.started && !context.Input.IsWebsocket() { 732 if !w.started && !context.Input.IsWebsocket() {
730 if AutoRender { 733 if AutoRender {
731 method = vc.MethodByName("Render") 734 method = vc.MethodByName("Render")
732 method.Call(in) 735 callMethodWithError(method, in)
733 } 736 }
734 } 737 }
735 } 738 }
...@@ -920,3 +923,15 @@ func (w *responseWriter) WriteHeader(code int) { ...@@ -920,3 +923,15 @@ func (w *responseWriter) WriteHeader(code int) {
920 w.started = true 923 w.started = true
921 w.writer.WriteHeader(code) 924 w.writer.WriteHeader(code)
922 } 925 }
926
927 // call method and panic with error if error is in result params
928 func callMethodWithError(method reflect.Value, params []reflect.Value) {
929 results := method.Call(params)
930 if len(results) > 0 {
931 for _, result := range results {
932 if result.Type() == errorType && !result.IsNil() {
933 panic(result.Interface().(error))
934 }
935 }
936 }
937 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!