panic
panic 是运行时的“不可恢复错误”,会立即终止当前函数执行,并开始向上层调用栈展开(stack unwinding)。
panic 会
- 立即停止当前函数
- 执行所有 defer
- 一层层向上返回
- 如果没人 recover
- 打印 stack trace
- 程序崩溃
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()
}()