- 在`defer`中调用了内置函数`recover`,`recover`会使程序从 `panic`中恢复,并返回`panic value`,recover()函数接收的值就是panic()函数传递的值
- 导致`panic`异常的函数不会继续运行,但能正常返回
- 在未发生`panic`时调用`recover`,`recover`会返回`nil`
- defer函数需要定义在panic函数之前
- 如果函数中没有定义recover函数,则panic会将错误返回到函数调用处
- 程序中defer函数的执行先定义后执行,执行顺序类似于栈(先进后出),这个执行顺序只针对每一函数或者方法;跳出这个函数或方法的调用部分又是一个函数或方法,则重新按照defer的定义的顺序执行
- 程序中发生panic,这个函数后面的代码不再执行,包括后面代码中定义的defer函数
示例1
func main() {
defer func() {
if err := recover(); err != nil {
log.Println("defer--->", err)
}
}()
panic("提前终止程序!")
log.Println("结束了!") // 代码不执行
}

示例2
func fn1() {
defer func() {
if err := recover(); err != nil {
log.Println("defer--->", err)
}
}()
panic("fn1函数报错了")
}
func fn2() {
log.Println("这里是fn2函数")
}
func main() {
for i := 0; i < 3; i++ {
fn1() // 当fn1函数报错时,recover恢复报错,程序继续向下执行
fn2()
}
}
