mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-07 20:30:36 -05:00
hugolib: Improve panic handling in layout rendering
This commit is contained in:
parent
794ea21e94
commit
61bb3ccab3
1 changed files with 19 additions and 6 deletions
|
@ -1966,27 +1966,40 @@ func (s *Site) renderAndWritePage(name string, dest string, p *PageOutput, layou
|
||||||
return s.publish(dest, outBuffer)
|
return s.publish(dest, outBuffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Site) renderForLayouts(name string, d interface{}, w io.Writer, layouts ...string) error {
|
func (s *Site) renderForLayouts(name string, d interface{}, w io.Writer, layouts ...string) (err error) {
|
||||||
|
var templ tpl.Template
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
recover()
|
if r := recover(); r != nil {
|
||||||
|
templName := ""
|
||||||
|
if templ != nil {
|
||||||
|
templName = templ.Name()
|
||||||
|
}
|
||||||
|
helpers.DistinctErrorLog.Printf("Failed to render %q: %s", templName, r)
|
||||||
|
// TOD(bep) we really need to fix this. Also see below.
|
||||||
|
if !s.running() && !testMode {
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
templ := s.findFirstTemplate(layouts...)
|
|
||||||
|
templ = s.findFirstTemplate(layouts...)
|
||||||
if templ == nil {
|
if templ == nil {
|
||||||
return fmt.Errorf("[%s] Unable to locate layout for %q: %s\n", s.Language.Lang, name, layouts)
|
return fmt.Errorf("[%s] Unable to locate layout for %q: %s\n", s.Language.Lang, name, layouts)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := templ.Execute(w, d); err != nil {
|
if err = templ.Execute(w, d); err != nil {
|
||||||
// Behavior here should be dependent on if running in server or watch mode.
|
// Behavior here should be dependent on if running in server or watch mode.
|
||||||
helpers.DistinctErrorLog.Printf("Error while rendering %q: %s", name, err)
|
helpers.DistinctErrorLog.Printf("Error while rendering %q: %s", name, err)
|
||||||
if !s.running() && !testMode {
|
if !s.running() && !testMode {
|
||||||
// TODO(bep) check if this can be propagated
|
// TODO(bep) check if this can be propagated
|
||||||
os.Exit(-1)
|
os.Exit(-1)
|
||||||
} else if testMode {
|
} else if testMode {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Site) findFirstTemplate(layouts ...string) tpl.Template {
|
func (s *Site) findFirstTemplate(layouts ...string) tpl.Template {
|
||||||
|
|
Loading…
Reference in a new issue