如果 defer 中调用了 recover(),能捕获到 panic 吗?下面这段代码输出什么?
func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
panic("panic!")
defer fmt.Println("4")
}
答:
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("recovered:", r) // ✅ 可以捕获
}
}()
panic("something wrong")
// 输出: recovered: something wrong
}
核心规则: recover() 只有在 defer 的函数中直接调用才生效。只要符合这个条件,就能捕获 panic 防止程序崩溃。
panic 之后的 defer 不会再注册!
defer fmt.Println("1") // 注册 ✅
defer fmt.Println("2") // 注册 ✅
defer fmt.Println("3") // 注册 ✅
panic("panic!") // ← 走到这里程序就 panic 了,后面的代码不执行
defer fmt.Println("4") // ❌ 永远不会被执行(panic 后面的代码)
原创
defer常见误区
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法