Go语言-painc和recover技巧

Java程序为了防止意外退出,在处理异常时候有try-catch,golang我们则会想到recover函数来处理painc。

recover的使用

recover()是go的内置函数,只能放在defer中,recover的返回值是painc中的对象。常见的用法如下:

1
2
3
4
5
6
7
8
9
func process(i int){
defer func() {
if r := recover(); r != nil {
fmt.Printf("捕获到的错误:%s\n", r)
}
}()

painc("退出")
}

注意事项

  1. recover一定要在defer中,且不能直接调用 比如 defer recover
  2. 如果循环体中出现了painc,因为recover在defer中,则循环会被break,并且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
28
29
30
31
32
33
34
35
36
37
//我们希望的是遇到偶数painc之后recover捕获error,还能继续执行但是循环已经被跳出了
func Recovery() {
for i := 0; i < 10; i++ {
defer func() {
if r := recover(); r != nil {
fmt.Printf("捕获到的错误:%s\n", r)
}
}()

if i%2 == 0 {
panic(fmt.Sprintf("偶数退出:%v",i))
}else{
fmt.Println(i)
}
}
}

//正确做法
func Recovery() {
for i := 0; i < 10; i++ {
process(i)
}
}

func process(i int){
defer func() {
if r := recover(); r != nil {
fmt.Printf("捕获到的错误:%s\n", r)
}
}()

if i%2 == 0 {
panic(fmt.Sprintf("偶数退出:%v",i))
}else{
fmt.Println(i)
}
}