recover的扑捉,defer函数的接受者和参数

1、recover必须隔一个函数帧栈才能捕获到

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//错误
func main() {
	recover()
	panic(1)
}
//错误
func main() {
	defer recover()
	panic(1)
}
//正确
func main() {
	defer func() {
		recover()
	}()
	panic(1)
}
//错误
func main() {
	defer func() {
		defer func(){
			recover()
		}
		
	}()
	panic(1)
}

2、defer函数的参数和接受者是在defer语句出现的位置做计算的

1
2
3
4
5
6
func main(){
    defer s.Add(1).Add(2)
    s.Add(3)
}
//调用顺序
s.add(1)-->s.Add(3)-->s.Add(2)