如果 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 后面的代码)