【Duke】panic和recover 018 - PingPongGooo/GoFoundation GitHub Wiki
panic
panic 用于不可以恢复的错误
panic 退出前会执行defer指定的内容
panic vs. os.Exit
os.Exit 退出时不会调用defer指定的函数
os.Exit退出时不输出当前调用栈信息
func TestPanicVxExit(t *testing.T) {
//defer func() {
// fmt.Println("Finally!")
//}()
defer func() {
if err:=recover();err !=nil {
fmt.Println("recovered from", err)
}
}()
fmt.Println("Start")
//panic(errors.New("Something wrong!"))
os.Exit(-1)
//fmt.Println("End")
}
最常见的 “错误恢复”
defer func() {
if err:=recover();err !=nil {
log.Error("recovered panic", err)
}
}()
当心! recover 称为恶魔
1. 形成僵尸服务进程,导致 health check 失效
2. “Let it crash” 往往是我们恢复不确定性错误的最好方法