2 回答

TA贡献1841条经验 获得超3个赞
您必须使用内置的 recover() 函数从 panic 中恢复,并且必须在延迟函数中调用它。
假设您有一个可能会惊慌失措的函数:
func doPanic() {
log.Println("about to panic")
panic("test")
}
创建一个帮助程序函数,以启动一个函数作为 goroutine “protected”(来自 panics):
func protect(f func()) {
defer func() {
if err := recover(); err != nil {
log.Printf("Recovered: %v", err)
}
}()
f()
}
并像这样使用它:
func main() {
go protect(doPanic)
for {
time.Sleep(time.Second)
fmt.Println("tick")
}
}
此测试应用将输出:
2021/03/04 14:12:31 about to panic
2021/03/04 14:12:31 Recovered: test
tick
tick
tick
...

TA贡献1784条经验 获得超8个赞
如果您希望其他goroutine不受影响,则每个goroutine必须推迟呼叫以从潜在的恐慌中恢复过来。recover
而不是
go queue.ConsumeAndDoSomething()
您应该使用
go func(){
defer func() {
if r := recover(); r != nil {
log.Error("goroutine paniqued: ", r)
}
}()
queue.ConsumeAndDoSomething()
}()
- 2 回答
- 0 关注
- 96 浏览
添加回答
举报