Golang stackError 补充go错误定位能力

Posted a-xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang stackError 补充go错误定位能力相关的知识,希望对你有一定的参考价值。

     用过go的都知道,go的error实现很简单,errors.New实现的error类并不存储堆栈数据,这导致一个问题,就是多次error return后,或panic后recover了,找不到触发异常的位置,这导致问题排查进一步很难定位。stackError实现类似于 java中的exception类,里面可以存储堆栈数据,并且通过单向链表记录error的触发嵌套关系,使日志追踪变的更加容易!

1、stackError的引用

go get 获取

go get github.com/lingdor/stackError

go.mod

require github.com/lingdor/stackError 0.1.5
go mod download

2、堆栈定位

func act1()error {
return stackError.New("here Error")
}
func main(){
err:=act1()
fmt.println(err.Error())
}

 

输出:

*stackError.stackError : here Error
at main.act1( /Users/user/go/testMain/src/main/main.go:17 )
at main.main( /Users/user/go/testMain/src/main/main.go:22 )
at runtime.main( /usr/local/Cellar/go/1.13.4/libexec/src/runtime/proc.go:203 )

3、使用派生error

func act1() error {
return stackError.New("here Error")
}
func main() {

er := act1()
ParentErr := stackError.NewParent("act1 error", er)
fmt.Println(ParentErr.Error())
}

输出:

*stackError.stackError : act1 error
at main.main( /Users/user/go/testMain/main.go:22 )
at runtime.main( /usr/local/Cellar/go/1.13.4/libexec/src/runtime/proc.go:203 )
*stackError.stackError : here Error
at main.act1( /Users/user/go/testMain/main.go:16 )
at main.main( /Users/user/go/testMain/main.go:21 )
at runtime.main( /usr/local/Cellar/go/1.13.4/libexec/src/runtime/proc.go:203 )


4、优雅处理error

//不用写哪么多if判断
func main() {
err := act1()
stackError.CheckPanic(err)
}
//可以日志清晰定位panic的位置

func main() {
defer func(){
if err := recover();err!=nil {
fmt.Println(err)
}
}()
stackError.Panic("here")
} 

以上是关于Golang stackError 补充go错误定位能力的主要内容,如果未能解决你的问题,请参考以下文章

如何在Docker中设定Go并部署应用

Golang✔️走进 Go 语言✔️ 第十九课 错误处理 & 时间处理

Golang✔️走进 Go 语言✔️ 第十九课 错误处理 & 时间处理

Go语言入门150题L1-063 吃鱼还是吃肉 (10 分) Go语言 | Golang

go mod下载依赖错误Get https://sum.golang.org

Go_19: Golang 中错误与异常需要重新认识