gerror

    使用方式

    接口文档

    https://godoc.org/github.com/gogf/gf/errors/gerror

    1. func New(value interface{}) error
    2. func NewText(text string) error
    3. func Cause(err error) error
    4. func Stack(err error) string
    5. func Wrap(err error, text string) error
    6. func Wrapf(err error, format string, args ...interface{}) error
    7. type Error
    8. func (err *Error) Cause() error
    9. func (err *Error) Error() string
    10. func (err *Error) Format(s fmt.State, verb rune)
    11. func (err *Error) Stack() string

    标准库的error错误实现比较简单,无法进行堆栈追溯,对于产生错误时的上层调用者来讲不是很友好,无法获得错误的调用链详细信息。gerror支持错误堆栈记录,通过New*/Wrap*均会自动记录当前错误产生时的堆栈信息。

    使用示例:

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/gogf/gf/errors/gerror"
    5. )
    6. func OpenFile() error {
    7. return gerror.New("permission denied")
    8. }
    9. func OpenConfig() error {
    10. return gerror.Wrap(OpenFile(), "configuration file opening failed")
    11. }
    12. func ReadConfig() error {
    13. return gerror.Wrap(OpenConfig(), "reading configuration failed")
    14. }
    15. func main() {
    16. fmt.Printf("%+v", ReadConfig())
    17. }
    1. reading configuration failed: configuration file opening failed: permission denied
    2. 1. reading configuration failed
    3. 1). main.ReadConfig
    4. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:18
    5. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:25
    6. 2. configuration file opening failed
    7. 1). main.OpenConfig
    8. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:14
    9. 2). main.ReadConfig
    10. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:18
    11. 3). main.main
    12. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:25
    13. 1). main.OpenFile
    14. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:10
    15. 2). main.OpenConfig
    16. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:14
    17. 3). main.ReadConfig
    18. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:18
    19. 4). main.main
    20. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:25

    可以看到,调用端可以通过Wrap方法将底层的错误信息进行层级叠加,并且包含完整的错误堆栈信息。

    通过以上示例我们可以看到,通过%+v的打印格式可以打印出完整的堆栈信息,当然gerror.Error对象支持多种fmt格式:

    使用示例:

    执行后,终端输出为:

    1. test1, test1, test1
    2. test1, test1, test1
    3. test2, test2, 1. test2
    4. 1). main.Error2
    5. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror1.go:15
    6. 2). main.main
    7. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror1.go:20
    8. test2, test2, test2
    9. 1. test2
    10. 1). main.Error2
    11. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror1.go:15
    12. 2). main.main
    13. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror1.go:20
    1. func Stack(err error) string

    通过Stack方法我们可以获得error对象的完整堆栈信息,返回堆栈列表字符串。
    注意参数为标准库error类型,当该参数为gerror模块生成的error时,
    或者开发者自定义的error对象实现了gerror.ApiStack接口时支持打印,否则,返回空字符串。

    1. package main
    2. import (
    3. "errors"
    4. "fmt"
    5. "github.com/gogf/gf/errors/gerror"
    6. )
    7. func Error1() error {
    8. return errors.New("test1")
    9. func Error2() error {
    10. return gerror.New("test2")
    11. }
    12. func main() {
    13. err1 := Error1()
    14. err2 := Error2()
    15. fmt.Println("err1:", gerror.Stack(err1))
    16. fmt.Println("err2:", gerror.Stack(err2))
    17. }

    执行后,终端输出:

    1. func Cause(err error) error

    通过Cause方法我们可以获得error对象的根错误信息(原始错误)。
    注意参数为标准库error类型,当该参数为gerror模块生成的error时,
    或者开发者自定义的error对象实现了gerror.ApiCause接口时支持打印,否则,返回输出的error对象。

    使用示例:

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/gogf/gf/errors/gerror"
    5. )
    6. func OpenFile() error {
    7. return gerror.New("permission denied")
    8. }
    9. func OpenConfig() error {
    10. return gerror.Wrap(OpenFile(), "configuration file opening failed")
    11. }
    12. func ReadConfig() error {
    13. return gerror.Wrap(OpenConfig(), "reading configuration failed")
    14. }
    15. func main() {
    16. fmt.Println(gerror.Cause(ReadConfig()))
    17. }

    执行后,终端输出:

    1. permission denied

    glog日志管理模块天然支持对gerror错误堆栈打印支持,这种支持不是强耦合性的,而是通过fmt格式化打印接口支持的。

    执行后,终端输出:

    1. 2019-07-13 15:01:31.131 test1
    2. 2019-07-13 15:01:31.131 test2
    3. 1. test2
    4. 1). main.Error2
    5. /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror5.go:16
    6. 2). main.main