总结:
panic触发后,会终止当前函数正常流程,按照已经注册的defer链表去执行。
如果本函数中没有recover,则将panic向上抛出,直到被recover;如果没有一直都没有recover,则程序终止。
defer中的panic可以嵌套。此时,defer相当于一个普通函数。
例子:
func main() {
ps := panicDemo4()
fmt.Println("ps:", ps)
}
func panicDemo4() (a string) {
defer func() {
if err := recover(); err != nil {
fmt.Println("panicDemo4 recover, err:", err)
a = "panic"
}
}()
defer fmt.Println("A")
defer func() {
fmt.Println("B")
if err := recover(); err != nil {
fmt.Println("recover, err:", err)
}
panic("panic in defer")
fmt.Println("C") // unreachable
}()
panic("panic in main")
fmt.Println("D") // unreachable
return "end" // unreachable
}
结果:
B
recover, err: panic in main
A
panicDemo4 recover, err: panic in defer
ps: panic