Skip to content

Commit

Permalink
Improve nilpointer error message
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed Feb 1, 2024
1 parent 4174a78 commit 8d42a79
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 1 deletion.
21 changes: 21 additions & 0 deletions common/herrors/errors.go
Expand Up @@ -19,8 +19,10 @@ import (
"fmt"
"io"
"os"
"regexp"
"runtime"
"runtime/debug"
"strings"
"time"
)

Expand Down Expand Up @@ -116,3 +118,22 @@ func IsNotExist(err error) bool {

return false
}

var nilPointerErrRe = regexp.MustCompile(`at <(.*)>: error calling (.*?): runtime error: invalid memory address or nil pointer dereference`)

func ImproveIfNilPointer(inErr error) (outErr error) {
outErr = inErr

m := nilPointerErrRe.FindStringSubmatch(inErr.Error())
if len(m) == 0 {
return
}
call := m[1]
field := m[2]
parts := strings.Split(call, ".")
receiverName := parts[len(parts)-2]
receiver := strings.Join(parts[:len(parts)-1], ".")
s := fmt.Sprintf("– %s is nil; wrap it in if or with: {{ with %s }}{{ .%s }}{{ end }}", receiverName, receiver, field)
outErr = errors.New(nilPointerErrRe.ReplaceAllString(inErr.Error(), s))
return
}
12 changes: 12 additions & 0 deletions hugolib/paginator_test.go
Expand Up @@ -170,3 +170,15 @@ Paginator: {{ .Paginator }}
b.Assert(err, qt.IsNotNil)
b.Assert(err.Error(), qt.Contains, `error calling Paginator: pagination not supported for this page: kind: "page"`)
}

func TestNilPointerErrorMessage(t *testing.T) {
files := `
-- hugo.toml --
-- content/p1.md --
-- layouts/_default/single.html --
Home Filename: {{ site.Home.File.Filename }}
`
b, err := TestE(t, files)
b.Assert(err, qt.IsNotNil)
b.Assert(err.Error(), qt.Contains, `_default/single.html:1:22: executing "_default/single.html" – File is nil; wrap it in if or with: {{ with site.Home.File }}{{ .Filename }}{{ end }}`)
}
3 changes: 2 additions & 1 deletion hugolib/site_render.go
Expand Up @@ -20,6 +20,7 @@ import (
"strings"
"sync"

"github.com/gohugoio/hugo/common/herrors"
"github.com/gohugoio/hugo/hugolib/doctree"

"github.com/gohugoio/hugo/config"
Expand Down Expand Up @@ -110,7 +111,7 @@ func (s *Site) renderPages(ctx *siteRenderContext) error {

err := <-errs
if err != nil {
return fmt.Errorf("failed to render pages: %w", err)
return fmt.Errorf("failed to render pages: %w", herrors.ImproveIfNilPointer(err))
}
return nil
}
Expand Down

0 comments on commit 8d42a79

Please sign in to comment.