文章目錄:
- errors
- pkg/errors
- 普通的
- 帶堆疊,包裝描述
- 帶堆疊,不包裝描述
- 不帶堆疊,包裝描述
- 思考
errors
這個大家肯定使用過,標準庫的 errors 錯誤實作比較簡單,無法進行堆疊追溯,對于產生錯誤時的上層呼叫者來講不是很友好,無法獲得錯誤的呼叫鏈詳細資訊,
// 不帶堆疊
err := errors.New("error msg")
fmt.Printf("%+v\n", err)
// 輸出
error msg
pkg/errors
github.com/pkg/errors 支持堆疊資訊,可以獲得錯誤的呼叫鏈詳細資訊,
普通的
// 帶堆疊
err := errors.New("error msg")
fmt.Printf("%+v\n", err)
// 輸出
error msg
main.main
/Users/xinliang/go/project/demo/err/err.go:14
runtime.main
/usr/local/go/src/runtime/proc.go:225
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1371
帶堆疊,包裝描述
err := errors.Wrap(err error, message string)
或
err := errors.Wrapf(err error, format string, args ...interface{})
帶堆疊,不包裝描述
err := errors.WithStack(err error)
不帶堆疊,包裝描述
err := errors.WithMessage(err error, message string)
或
err := errors.WithMessagef(err error, format string, args ...interface{})
思考
大家想一想,我們在使用 pkg/errors 時,會遇到什么問題?
會遇到重復堆疊的問題!
比如,一個方法的呼叫鏈路比較長,就會出現這種情況,舉個例子:
func main() {
err := func1()
fmt.Printf("%+v\n", errors.Wrapf(err, "func1 error occurred"))
}
func func1() error {
err := func2()
return errors.Wrapf(err, "func2 error occurred")
}
func func2() error {
err := errors.New("error msg")
return err
}
想想看,會列印出什么?
是不是發現列印出的堆疊資訊有重復的?
如何去解決這個問題?快來我的星球交流討論吧,https://t.zsxq.com/iIUVVnA
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/286030.html
標籤:其他
上一篇:原型模式(四)
