defer 与 panic 的问题(defer 之二)

2018/01/25

defer 与 panic 问题

package main

func f1() {
	defer println("f1-begin")
	f2()
	defer println("f1-end")
}

func f2() {
	defer println("f2-begin")
	f3()
	defer println("f2-end")
}

func f3() {
	defer println("f3-begin")
	panic(0)
	defer println("f3-end")
}

func main() {
	f1()
}

最后 f3 中 panic,所以 defer 不再增加,defer 栈是:f11 f21 f31 panic

第二个问题

package main

import "log"

func f() {
	defer func() {
		if r := recover(); r != nil {
			log.Printf("recover:%#v", r)
		}
	}()
	panic(1)
	panic(2)
}

func main() {
	f()
}

两个 panic 的时候 recover,结果是什么:

panic 之后,要么直接退出函数,要么 recover 一下退出函数,不会再执行别的代码

参考