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)定位代碼層面上下文問題。
當(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()存在問題。這個(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)文章
讓goland支持proto文件類型的實(shí)現(xiàn)
這篇文章主要介紹了讓goland支持proto文件類型的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go語(yǔ)言sync鎖與對(duì)象池的實(shí)現(xiàn)
本文介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)sync包提供的并發(fā)控制工具,主要包括互斥鎖(sync.Mutex)和讀寫鎖(sync.RWMutex)兩類同步機(jī)制,下面就來(lái)具體介紹一下這兩個(gè)的使用,感興趣的可以了解一下2025-08-08
如何用go操作iptables和ipset設(shè)置黑白名單
這篇文章主要介紹了如何用go操作iptables和ipset設(shè)置黑白名單問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
GO中?分組聲明與array,?slice,?map函數(shù)
這篇文章主要介紹了GO中?分組聲明與array,slice,map函數(shù),Go語(yǔ)言中,同時(shí)聲明多個(gè)常量、變量,或者導(dǎo)入多個(gè)包時(shí),可采用分組的方式進(jìn)行聲明,下面詳細(xì)介紹需要的小伙伴可以參考一下2022-03-03
Go通過(guò)SJSON實(shí)現(xiàn)動(dòng)態(tài)修改JSON
在Go語(yǔ)言 json 處理領(lǐng)域,在 json 數(shù)據(jù)處理中,讀取與修改是兩個(gè)核心需求,本文我們就來(lái)看看如何使用SJSON進(jìn)行動(dòng)態(tài)修改JSON吧,有需要的小伙伴可以了解下2025-03-03
Golang 如何限制木馬圖片上傳服務(wù)器的實(shí)例
本文主要介紹了Golang 如何限制木馬圖片上傳服務(wù)器的實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

