panic与recover
1.引发panic两种方式,调用panic函数与运行时产生错误
-
程序会从调用panic或者发送panic的地方立即返回,逐层向上调用defer函数,直到被recover捕获
-
panic是一个空接口类型 interface{},调用 panic(xxxx)
-
panic 不但可以在函数正常流程中抛出,在defer逻辑里也可以再次抛出panic,defer里的panic能被后续执行的defer捕获
5.recover捕获例子
//recover()与defer一起用
//失败情况
defer recover()
defer fmt.Println(recover())
defer func(){
func(){
println("defer inner")
recover()
}() //recover在defer嵌套的两层里面,无效
}()
//以下成功情形,recover在defer后面的函数体内被直接调用
defer func(){
println("defer inner")
recover()
}()
func except(){
recover()
}
defer test(){
defer except()
panic("test panic")
}
6.多个panic抛出,最后一个被执行的被捕获
package main
import "fmt"
func main() {
defer func () {
if err := recover(); err != nil{
fmt.Println(err)
}
}()
defer func () {
fmt.Println("111")
panic("first defer panic")
}()
defer func(){
fmt.Println("222")
panic("secon defer")
}()
fmt.Println("333")
panic("main body")
fmt.Println("444")
}
//输出
333
222
111
fisrt defer panic
7.init函数引发的panic只能在init函数中捕获,在main中无法捕获,原因时init先于main执行, 函数不能捕获内部新启动的goroutine所抛出的panic