Golang中使用errors返回调用堆栈信息
作者:毛小子
Golang的errors包返回堆栈信息
标准库errors提供了处理错误的方法。比如常用的func New(text string) error
用该方法处理错误信息,就只会输出自定义的 text 到控制台或者日志文件,
没有其它辅助排查的信息输出,所以常规我们就只能根据 text 去全局搜哪里抛出了这个错误,再来定位代码层面上下文问题。
当然,不是不行,但是嵌套代码多,抛出 text 存在多处一致的情况,就比较麻烦了。比如以下例子:
package main import ( "errors" "fmt" "os" ) func err1() error { return errors.New("报错啦,抛出异常!!") } func err2() error { return errors.New("报错啦,抛出异常!!") } func err3() error { return errors.New("报错啦,抛出异常!!") } func main() { err := err1() if err != nil { fmt.Println(err) os.Exit(0) } err = err2() if err != nil { fmt.Println(err) os.Exit(0) } err = err3() if err != nil { fmt.Println(err) os.Exit(0) } }
运行结果:
报错啦,抛出异常!!
代码中有三处同样的错误输出,根据这个错误信息,无法判断是来源于哪个方法,只能通过调试或者在每个 err!=nil 内再加输出进行定位。
这里就可以用第三方的开源库:github.com/go-errors/errors
下面用 github.com/go-errors/errors改造下
package main import ( "fmt" "github.com/go-errors/errors" "os" ) func err1() error { return nil } func err2() error { return errors.New("报错啦,抛出异常!!") } func err3() error { return errors.New("报错啦,抛出异常!!") } func main() { err := err1() if err != nil { fmt.Println(err.(*errors.Error).ErrorStack()) os.Exit(0) } err = err2() if err != nil { fmt.Println(err.(*errors.Error).ErrorStack()) os.Exit(0) } err = err3() if err != nil { fmt.Println(err.(*errors.Error).ErrorStack()) os.Exit(0) } }
运行结果:
*errors.Error 报错啦,抛出异常!!
D:/gotest/src/test/main.go:14 (0x49756b)
main: return errors.New("报错啦,抛出异常!!")
D:/gotest/src/test/main.go:27 (0x497559)
main: err = err2()
D:/golang/src/runtime/proc.go:250 (0x4379fe)
main: fn()
D:/golang/src/runtime/asm_amd64.s:1594 (0x45ee41)
goexit: BYTE $0x90 // NOP
有了调用堆栈信息,就很明确知道 err2()存在问题。这个库会记录调用栈,通过ErrorStack方法返回调用栈信息
以上就是Golang中使用errors返回调用堆栈信息的详细内容,更多关于Golang errors返回堆栈信息的资料请关注脚本之家其它相关文章!