Golang中使用errors返回調(diào)用堆棧信息
Golang的errors包返回堆棧信息
標(biāo)準(zhǔn)庫(kù)errors提供了處理錯(cuò)誤的方法。比如常用的func New(text string) error
用該方法處理錯(cuò)誤信息,就只會(huì)輸出自定義的 text 到控制臺(tái)或者日志文件,
沒有其它輔助排查的信息輸出,所以常規(guī)我們就只能根據(jù) text 去全局搜哪里拋出了這個(gè)錯(cuò)誤,再來(lái)定位代碼層面上下文問(wèn)題。
當(dāng)然,不是不行,但是嵌套代碼多,拋出 text 存在多處一致的情況,就比較麻煩了。比如以下例子:
package main import ( "errors" "fmt" "os" ) func err1() error { return errors.New("報(bào)錯(cuò)啦,拋出異常??!") } func err2() error { return errors.New("報(bào)錯(cuò)啦,拋出異常??!") } func err3() error { return errors.New("報(bào)錯(cuò)啦,拋出異常??!") } 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) } }
運(yùn)行結(jié)果:
報(bào)錯(cuò)啦,拋出異常??!
代碼中有三處同樣的錯(cuò)誤輸出,根據(jù)這個(gè)錯(cuò)誤信息,無(wú)法判斷是來(lái)源于哪個(gè)方法,只能通過(guò)調(diào)試或者在每個(gè) err!=nil 內(nèi)再加輸出進(jìn)行定位。
這里就可以用第三方的開源庫(kù):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("報(bào)錯(cuò)啦,拋出異常??!") } func err3() error { return errors.New("報(bào)錯(cuò)啦,拋出異常??!") } 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) } }
運(yùn)行結(jié)果:
*errors.Error 報(bào)錯(cuò)啦,拋出異常!!
D:/gotest/src/test/main.go:14 (0x49756b)
main: return errors.New("報(bào)錯(cuò)啦,拋出異常??!")
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
有了調(diào)用堆棧信息,就很明確知道 err2()存在問(wèn)題。這個(gè)庫(kù)會(huì)記錄調(diào)用棧,通過(guò)ErrorStack方法返回調(diào)用棧信息
以上就是Golang中使用errors返回調(diào)用堆棧信息的詳細(xì)內(nèi)容,更多關(guān)于Golang errors返回堆棧信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
聊聊go xorm生成mysql的結(jié)構(gòu)體問(wèn)題
這篇文章主要介紹了go xorm生成mysql的結(jié)構(gòu)體問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-03-03Go語(yǔ)言使用Cobra實(shí)現(xiàn)強(qiáng)大命令行應(yīng)用
Cobra是一個(gè)強(qiáng)大的開源工具,能夠幫助我們快速構(gòu)建出優(yōu)雅且功能豐富的命令行應(yīng)用,本文為大家介紹了如何使用Cobra打造強(qiáng)大命令行應(yīng)用,感興趣的小伙伴可以了解一下2023-07-07Go語(yǔ)言sync.Map詳解及使用場(chǎng)景
Go語(yǔ)言中的sync.Map是一個(gè)高效的并發(fā)安全映射結(jié)構(gòu),適用于高并發(fā)讀多寫少的場(chǎng)景,它通過(guò)讀寫分離、無(wú)鎖讀取路徑、寫入時(shí)的鎖保護(hù)等機(jī)制,提高了讀取性能并減少了鎖競(jìng)爭(zhēng),sync.Map不需要手動(dòng)管理鎖,降低了編程復(fù)雜性,適合需要簡(jiǎn)單并發(fā)訪問(wèn)的場(chǎng)合2024-10-10golang優(yōu)化目錄遍歷的實(shí)現(xiàn)方法
對(duì)于go1.16的新變化,大家印象最深的可能是io包的大規(guī)模重構(gòu),但這個(gè)重構(gòu)實(shí)際上還引進(jìn)了一個(gè)優(yōu)化,這篇文章要說(shuō)的就是這個(gè)優(yōu)化,所以本將給大家介紹golang是如何優(yōu)化目錄遍歷的,需要的朋友可以參考下2024-08-08Golang內(nèi)存泄漏場(chǎng)景以及解決方案詳析
golang中內(nèi)存泄露的發(fā)現(xiàn)與排查一直是來(lái)是go開發(fā)者頭疼的一件事,下面這篇文章主要給大家介紹了關(guān)于Golang內(nèi)存泄漏場(chǎng)景以及解決的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01Go語(yǔ)言中基本數(shù)據(jù)類型的相互轉(zhuǎn)換詳解
Go在不同類型的變量之間賦值時(shí)需要顯示轉(zhuǎn)換,不能自動(dòng)轉(zhuǎn)換。這篇文章主要和大家介紹了Go語(yǔ)言中基本數(shù)據(jù)類型的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下2022-10-10