golang中painc和recover的坑

本文记录一个golang的recover和painc的坑。

recover和painc

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// 不能捕获
func f1()){
recover()
painc("exception")
}

// 不能捕获
func f2(){
defer recover()
painc("exception")
}

// 可以捕获
func f3(){
defer func (){
recover()
}

painc("exception")
}

// 不能捕获
func f4(){
defer func (){
func (){
recover()
}
}
painc("exception")
}

// 不能捕获
func f5(){
defer func(){
recover()
}
go func(){
painc("exception)
}
}

// recover和painc的函数签名
func painc(interface{})
func recover() interface{}

结论

  1. painc未捕获会直接终止应用
  2. recover必须和defer一起用才有效
  3. defer和recover必须隔一个函数栈
  4. 不能跨gorountine捕获painc
  5. recover的返回值是painc传入的值,当函数没有发生painc,那么recover将总是返回nil