打印错误对象中的堆栈信息

通过 fmt/glog 或者其他包打印错误对象时,默认情况下不会输出错误堆栈信息。例如:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/encoding/gjson"
  5. )
  6. func main() {
  7. _, err := gjson.Encode(func() {})
  8. fmt.Printf("err: %v", err)
  9. }

执行后,终端输出:

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

打印错误对象中的错误堆栈信息,应当使用 %+v 的格式化方式。例如:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/encoding/gjson"
  5. )
  6. func main() {
  7. _, err := gjson.Encode(func() {})
  8. fmt.Printf("err: %+v", err)
  9. }

执行后,终端输出:

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

使用Wrap方法时,避免重复的错误信息打印

当对错误对象进行 Wrap 时,不要将错误对象打印到 Wrap 的错误信息中,因为 Wrap 时本身会将目标错误对象包裹到创建的新的错误对象内部。如果将错误信息再打印包含在错误字符串中,那么在打印错误堆栈的时候会出现错误信息重复。例如(为简化示例,这里没有打印堆栈信息):

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/encoding/gjson"
  5. "github.com/gogf/gf/v2/errors/gerror"
  6. )
  7. func main() {
  8. _, err1 := gjson.Encode(func() {})
  9. err2 := gerror.Wrapf(err1, `error occurred: %v`, err1)
  10. fmt.Printf("err: %v", err2)
  11. }

执行后,终端输出,可以看到,打印的错误信息出现了重复:

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

我们将上面的示例代码修复一下,如下:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/encoding/gjson"
  5. "github.com/gogf/gf/v2/errors/gerror"
  6. )
  7. func main() {
  8. _, err1 := gjson.Encode(func() {})
  9. err2 := gerror.Wrap(err1, `error occurred`)
  10. fmt.Printf("err: %v", err2)
  11. }

执行后,终端输出:

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