panic
- panic 用户不可恢复的错误
- panic 推出前会执行 defer 指定的内容
panic vs. os.Exit
- os.Exit 退出时不回调用 defer 指定的函数
- os.Exit 退出时不输出当前调用栈信息
recover
Java、 C++、 .Net
try{
}catch(){
}
go语言
defer func(){
if er := recover(); err != nill {
// 恢复错误
}
}()
最常见的“错误恢复”
defer func() {
if er := recover(); err != nill {
log.Error("recovered panic",err)
}
}()
当心!recover 成为噩梦
- 形成僵尸服务进程,导致 health check 失效。
- “Let it Crash!”往往是我们恢复不确定性错误的最好方法。