背景:goroutine func 内 panic 不会影响外部协程,所以外部协程对 goroutine func 内的 panic 可能无感知,可能会发生 goroutine func 内的 panic 但外部协程正常往下执行的情况。
所以:要在 goroutine func 内的识别 panic 打印日志,可选的把err返出来,若真的需要返出err的话要使用channel。
// 伪代码
func Ping(ctx context.Context) error {
... code ...
go func() {
defer func() {
if r := recover(); r != nil {
log.Errorc(ctx, "[dao] ping panic: %v, stack: %v", r, string(debug.Stack()))
}
}()
... code ...
}()
... code ...
return nil
}