【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” 往往是我们恢复不确定性错误的最好方法