Skip to main content
Version: 2.8.x(Latest)

When printing error objects via fmt/glog or other packages, stack information is not output by default. For example:

package main

import (
"fmt"

"github.com/gogf/gf/v2/encoding/gjson"
)

func main() {
_, err := gjson.Encode(func() {})
fmt.Printf("err: %v", err)
}

After execution, the terminal output:

err: json.Marshal failed: json: unsupported type: func()

To print stack information from an error object, use the %+v formatting option. For example:

package main

import (
"fmt"

"github.com/gogf/gf/v2/encoding/gjson"
)

func main() {
_, err := gjson.Encode(func() {})
fmt.Printf("err: %+v", err)
}

After execution, the terminal output:

err: json.Marshal failed: json: unsupported type: func()
1. json.Marshal failed
1). github.com/gogf/gf/v2/internal/json.Marshal
/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/internal/json/json.go:30
2). github.com/gogf/gf/v2/encoding/gjson.Encode
/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/encoding/gjson/gjson_stdlib_json_util.go:41
3). main.main
/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.test/main.go:10
2. json: unsupported type: func()

Avoid Repeated Error Message Printing When Using the Wrap Method

Do not print the error object into the error message when Wrapping an error object, as Wrap inherently encapsulates the target error object within the newly created error object. Including the error again in the error string can cause duplications when printing the error stack. For instance (the stack information is not printed for simplification):

package main

import (
"fmt"

"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gerror"
)

func main() {
_, err1 := gjson.Encode(func() {})
err2 := gerror.Wrapf(err1, `error occurred: %v`, err1)
fmt.Printf("err: %v", err2)
}

After execution, the terminal output shows duplicate error messages:

err: error occurred: json.Marshal failed: json: unsupported type: func(): json.Marshal failed: json: unsupported type: func()

Let's fix the above code example as shown below:

package main

import (
"fmt"

"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gerror"
)

func main() {
_, err1 := gjson.Encode(func() {})
err2 := gerror.Wrap(err1, `error occurred`)
fmt.Printf("err: %v", err2)
}

After execution, the terminal output:

err: error occurred: json.Marshal failed: json: unsupported type: func()