go的错误处理
1.通常处理
错误需要开发者主动捕获,同时只能获取是什么错误,无法获悉调用栈(确定具体哪一行,也就是不知道那行出了错误)
_,err := func()
if err != nil {
//错误处理
}
2.几种常见创建错误的方法
- 1)errors.New()
err1 := errors.New("math: square root of negative number")
- 2)fmt.Errorf()
err2 := fmt.Errorf("math: square root of negative number %g", x)
- 3)自定义,实现error接口
type MyErr struct{}
func (myerr *MyErr) Error() error {
}
3.github.com/pkg/errors
- 主要调用函数
errors.WithMessage(err,"bar failed") 只能携带原始错误信息
errors.WithStack(err) //不携带原始错误信息,保留完整的调用栈
errors.Wrap(err,"custom message") //携带原始错误信息, 还能尽量保留完整的调用栈
- 打印错误
fmt.Printf("data not found, %v\n", err)
fmt.Printf("%+v\n", err)
使用 %v 作为格式化参数,那么错误信息会保持一行, 其中依次包含调用栈的上下文文本。使用 %+v ,则会输出完整的调用栈详情。如果不需要增加额外上下文信息,仅附加调用栈后返回,可以使用 WithStack 方法