Golang中使用errors返回調用堆棧信息
Golang的errors包返回堆棧信息
標準庫errors提供了處理錯誤的方法。比如常用的func New(text string) error
用該方法處理錯誤信息,就只會輸出自定義的 text 到控制臺或者日志文件,
沒有其它輔助排查的信息輸出,所以常規(guī)我們就只能根據(jù) text 去全局搜哪里拋出了這個錯誤,再來定位代碼層面上下文問題。
當然,不是不行,但是嵌套代碼多,拋出 text 存在多處一致的情況,就比較麻煩了。比如以下例子:
package main
import (
"errors"
"fmt"
"os"
)
func err1() error {
return errors.New("報錯啦,拋出異常?。?)
}
func err2() error {
return errors.New("報錯啦,拋出異常?。?)
}
func err3() error {
return errors.New("報錯啦,拋出異常??!")
}
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)
}
}
運行結果:
報錯啦,拋出異常!!
代碼中有三處同樣的錯誤輸出,根據(jù)這個錯誤信息,無法判斷是來源于哪個方法,只能通過調試或者在每個 err!=nil 內(nèi)再加輸出進行定位。
這里就可以用第三方的開源庫: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("報錯啦,拋出異常??!")
}
func err3() error {
return errors.New("報錯啦,拋出異常?。?)
}
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)
}
}
運行結果:
*errors.Error 報錯啦,拋出異常!!
D:/gotest/src/test/main.go:14 (0x49756b)
main: return errors.New("報錯啦,拋出異常?。?quot;)
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
有了調用堆棧信息,就很明確知道 err2()存在問題。這個庫會記錄調用棧,通過ErrorStack方法返回調用棧信息
以上就是Golang中使用errors返回調用堆棧信息的詳細內(nèi)容,更多關于Golang errors返回堆棧信息的資料請關注腳本之家其它相關文章!

