错误堆栈
标准库的error错误实现比较简单,无法进行堆栈追溯,对于产生错误时的上层调用者来讲不是很友好,无法获得错误的调用链详细信息。gerror支持错误堆栈记录,通过New/Newf、Wrap/Wrapf等方法均会自动记录当前错误产生时的堆栈信息。
使用示例:
package mainimport ("fmt""github.com/gogf/gf/errors/gerror")func OpenFile() error {return gerror.New("permission denied")}func OpenConfig() error {return gerror.Wrap(OpenFile(), "configuration file opening failed")}func ReadConfig() error {return gerror.Wrap(OpenConfig(), "reading configuration failed")}func main() {fmt.Printf("%+v", ReadConfig())}
执行后,终端输出:
reading configuration failed: configuration file opening failed: permission denied1. reading configuration failed1). main.ReadConfig/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:182). main.main/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:252. configuration file opening failed1). main.OpenConfig/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:142). main.ReadConfig/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:183). main.main/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:253. permission denied1). main.OpenFile/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:102). main.OpenConfig/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:143). main.ReadConfig/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:184). main.main/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/geg/errors/gerror/gerror2.go:25
可以看到,调用端可以通过Wrap方法将底层的错误信息进行层级叠加,并且包含完整的错误堆栈信息。
Stack 获取堆栈信息
func Stack(err error) string
通过Stack方法我们可以获得error对象的完整堆栈信息,返回堆栈列表字符串。 注意参数为标准库error类型,当该参数为gerror模块生成的error时, 或者开发者自定义的error对象实现了该接口时支持打印,否则,返回空字符串。
使用示例:
package mainimport ("errors""fmt""github.com/gogf/gf/errors/gerror")func main() {var err errorerr = errors.New("sql error")err = gerror.Wrap(err, "adding failed")err = gerror.Wrap(err, "api calling failed")fmt.Println(gerror.Stack(err))}
执行后,终端输出:
1. api calling failed1). main.main/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/other/test.go:142. adding failed1). main.main/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/other/test.go:133. sql error
Current 获取当前error
func Current(err error) error
Current方法用于获取当前层级的错误信息,通过error接口对象返回。
使用示例:
package mainimport ("errors""fmt""github.com/gogf/gf/errors/gerror")func main() {var err errorerr = errors.New("sql error")err = gerror.Wrap(err, "adding failed")err = gerror.Wrap(err, "api calling failed")fmt.Println(err)fmt.Println(gerror.Current(err))}
执行后,终端输出:
api calling failed: adding failed: sql errorapi calling failed
Next 获取下一层error
func Next(err error) error
Next方法用于获取层级错误的下一级错误error接口对象。当下一层级不存在时,返回nil。
使用示例:
package mainimport ("errors""fmt""github.com/gogf/gf/errors/gerror")func main() {var err errorerr = errors.New("sql error")err = gerror.Wrap(err, "adding failed")err = gerror.Wrap(err, "api calling failed")fmt.Println(err)err = gerror.Next(err)fmt.Println(err)err = gerror.Next(err)fmt.Println(err)}
执行后,终端输出:
api calling failed: adding failed: sql erroradding failed: sql errorsql error
Cause 获取根error
func Cause(err error) error
通过Cause方法我们可以获得error对象的根错误信息(原始错误)。 注意参数为标准库error类型,当该参数为gerror模块生成的error时, 或者开发者自定义的error对象实现了该接口方法时支持打印,否则,返回输出的error对象。
使用示例:
package mainimport ("fmt""github.com/gogf/gf/errors/gerror")func OpenFile() error {return gerror.New("permission denied")}func OpenConfig() error {return gerror.Wrap(OpenFile(), "configuration file opening failed")}func ReadConfig() error {return gerror.Wrap(OpenConfig(), "reading configuration failed")}func main() {fmt.Println(gerror.Cause(ReadConfig()))}
执行后,终端输出:
permission denied
