Skip to content

panic

panic 是运行时的“不可恢复错误”,会立即终止当前函数执行,并开始向上层调用栈展开(stack unwinding)。

panic 会

  1. 立即停止当前函数
  2. 执行所有 defer
  3. 一层层向上返回
  4. 如果没人 recover
  5. 打印 stack trace
  6. 程序崩溃

recover

recover 用于捕获当前 goroutine 的 panic,让程序不崩溃,只能在 defer 里使用。

go
func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("recovered:", r)
        }
    }()

    panic("boom")
}

recover 必须是在函数内调用,也就是

go
defer func() {
	recover()
}()