"fmt"
        "strings"
 
+       "github.com/gohugoio/hugo/common/types"
+
        "github.com/gobwas/glob"
        "github.com/spf13/cast"
 )
 }
 
 // ToParamsAndPrepare converts in to Params and prepares it for use.
+// If in is nil, an empty map is returned.
 // See PrepareParams.
 func ToParamsAndPrepare(in interface{}) (Params, bool) {
+       if types.IsNil(in) {
+               return Params{}, true
+       }
        m, err := ToStringMapE(in)
        if err != nil {
                return nil, false
 
        }
 }
 
+func TestToParamsAndPrepare(t *testing.T) {
+       c := qt.New(t)
+       _, ok := ToParamsAndPrepare(map[string]interface{}{"A": "av"})
+       c.Assert(ok, qt.IsTrue)
+
+       params, ok := ToParamsAndPrepare(nil)
+       c.Assert(ok, qt.IsTrue)
+       c.Assert(params, qt.DeepEquals, Params{})
+}
+
 func TestRenameKeys(t *testing.T) {
        c := qt.New(t)
 
 
        b.AssertFileContent("public/index.html", "A|Children:C|B|")
 }
 
+// Issue #8825
+func TestMenuParamsEmptyYaml(t *testing.T) {
+       b := newTestSitesBuilder(t).WithConfigFile("yaml", `
+
+`)
+
+       b.WithTemplates("index.html", `{{ site.Menus }}`)
+
+       b.WithContent("p1.md", `---
+menus:
+  main: 
+    identity: journal
+    weight: 2
+    params:
+---    
+`)
+       b.Build(BuildCfg{})
+}
+
 func TestMenuParams(t *testing.T) {
        b := newTestSitesBuilder(t).WithConfigFile("toml", `
 [[menus.main]]
 
                                s.Log.Errorf("unable to process menus in site config\n")
                                s.Log.Errorln(err)
                        } else {
+                               handleErr := func(err error) {
+                                       if err == nil {
+                                               return
+                                       }
+                                       s.Log.Errorf("unable to process menus in site config\n")
+                                       s.Log.Errorln(err)
+
+                               }
+
                                for _, entry := range m {
                                        s.Log.Debugf("found menu: %q, in site config\n", name)
 
                                        menuEntry := navigation.MenuEntry{Menu: name}
                                        ime, err := maps.ToStringMapE(entry)
-                                       if err != nil {
-                                               s.Log.Errorf("unable to process menus in site config\n")
-                                               s.Log.Errorln(err)
-                                       }
+                                       handleErr(err)
+
+                                       err = menuEntry.MarshallMap(ime)
+                                       handleErr(err)
 
-                                       menuEntry.MarshallMap(ime)
                                        // TODO(bep) clean up all of this
                                        menuEntry.ConfiguredURL = s.Info.createNodeMenuEntryURL(menuEntry.ConfiguredURL)
 
 
 package navigation
 
 import (
+       "fmt"
        "html/template"
        "sort"
        "strings"
 
+       "github.com/pkg/errors"
+
        "github.com/gohugoio/hugo/common/maps"
        "github.com/gohugoio/hugo/common/types"
        "github.com/gohugoio/hugo/compare"
 type Page interface {
        LinkTitle() string
        RelPermalink() string
+       Path() string
        Section() string
        Weight() int
        IsPage() bool
        return false
 }
 
-func (m *MenuEntry) MarshallMap(ime map[string]interface{}) {
+func (m *MenuEntry) MarshallMap(ime map[string]interface{}) error {
+       var err error
        for k, v := range ime {
                loki := strings.ToLower(k)
                switch loki {
                case "parent":
                        m.Parent = cast.ToString(v)
                case "params":
-                       m.Params = maps.MustToParamsAndPrepare(v)
-
+                       var ok bool
+                       m.Params, ok = maps.ToParamsAndPrepare(v)
+                       if !ok {
+                               err = fmt.Errorf("cannot convert %T to Params", v)
+                       }
                }
        }
+
+       if err != nil {
+               return errors.Wrapf(err, "failed to marshal menu entry %q", m.KeyName())
+       }
+
+       return nil
 }
 
 func (m Menu) Add(me *MenuEntry) Menu {
 
                return pm, nil
        }
 
+       var wrapErr = func(err error) error {
+               return errors.Wrapf(err, "unable to process menus for page %q", p.Path())
+       }
+
        // Could be a structured menu entry
        menus, err := maps.ToStringMapE(ms)
        if err != nil {
-               return pm, errors.Wrapf(err, "unable to process menus for %q", p.LinkTitle())
+               return pm, wrapErr(err)
        }
 
        for name, menu := range menus {
                if menu != nil {
                        ime, err := maps.ToStringMapE(menu)
                        if err != nil {
-                               return pm, errors.Wrapf(err, "unable to process menus for %q", p.LinkTitle())
+                               return pm, wrapErr(err)
                        }
 
-                       menuEntry.MarshallMap(ime)
+                       if err = menuEntry.MarshallMap(ime); err != nil {
+                               return pm, wrapErr(err)
+                       }
                }
                pm[name] = &menuEntry
        }