在日常开发中,报错信息的打印对于程序的调试具有重要意义。本文将介绍一种帮助大家快速定位错误的方案。
第三方errors库
github.com/pkg/errors
是一个对标准库的error进行了封装的第三方库,他对外提供了对标准库的error的三种不同方式的封装。
WithMesage
和WithMessagef
函数
这两个函数用于给现有的error添加报错信息。他们之间最大的区别在于WithMessagef
可以根据格式化信息进行格式化。
Wrap
和Wrapf
函数
这两个函数主要用于给原有错误添加上下文环境,并记录一个调用栈。其中Wrapf
函数用于指定格式添加上下文信息
WithStack函数
主要给原有错误添加调用栈,这样将来打印的时候就可以用%+v
来打印整个调用栈
示例代码
package main
import (
"errors"
"log"
pkgerr "github.com/pkg/errors"
)
func main() {
log.Printf("%+v", deep3()) //with stack
err2 := msg2()
log.Printf("%+v", err2) //no stack
log.Printf("%+v", pkgerr.WithStack(err2))
}
func deep3() error {
return deep2()
}
func deep2() error {
return pkgerr.Wrap(deep1(), "deep2")
}
func deep1() error {
return errors.New("deep1")
}
func msg() error {
return errors.New("msg")
}
func msg2() error {
return pkgerr.WithMessage(msg(), "msg2")
}
打印结果如下
2019/05/21 01:22:17 deep1
deep2
main.deep2
/Users/baoyangc/code/goprojs/base/src/base/main/main.go:21
main.deep3
/Users/baoyangc/code/goprojs/base/src/base/main/main.go:17
main.main
/Users/baoyangc/code/goprojs/base/src/base/main/main.go:11
runtime.main
/Users/baoyangc/.gvm/gos/go1.12.5/src/runtime/proc.go:200
runtime.goexit
/Users/baoyangc/.gvm/gos/go1.12.5/src/runtime/asm_amd64.s:1337
2019/05/21 01:22:17 msg
msg2
2019/05/21 01:22:17 msg
msg2
main.main
/Users/xxxxx/code/goprojs/base/src/base/main/main.go:14
runtime.main
/Users/xxxxx/.gvm/gos/go1.12.5/src/runtime/proc.go:200
runtime.goexit
/Users/xxxxx/.gvm/gos/go1.12.5/src/runtime/asm_amd64.s:1337
网友评论