Golang stackError 补充go错误定位能力
阿旭^_^ 人气:1用过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/bobby96333/go/GoRabbitmqMonitor/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/bobby96333/go/GoRabbitmqMonitor/main.go:16 )
at main.main( /Users/bobby96333/go/GoRabbitmqMonitor/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") }
加载全部内容