panic defer recover

defer

  1. LIFO, 后进先出队列
  2. 在return语句之后,在返回上层函数之前执行
  3. 参数预编译,涉及到的参数,在定义defer的地方已经语句赋值了
1
2
3
4
5
6
7
8
func c() (i int) {
defer func() { i++ }()
return 1
}
func main() {
fmt.Println(c())
}

return 1将1赋值给i,defer执行,对i进行加1,最终返回值i为2

panic

  1. panic类似c语言里的throw,不再执行后面的语句
  2. 返回上一层函数之前,依然会执行之前的defer语句
  3. 直到遇到recover函数,处理异常,否则程序core
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
func main() {
f()
fmt.Println("Returned normally from f.")
}
func f() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
fmt.Println("Calling g.")
g(0)
fmt.Println("Returned normally from g.")
}
func g(i int) {
if i > 3 {
fmt.Println("Panicking!")
panic(fmt.Sprintf("%v", i))
}
defer fmt.Println("Defer in g", i)
fmt.Println("Printing in g", i)
g(i + 1)
}
Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
Returned normally from f.

本文标题:panic defer recover

文章作者:Louis

发布时间:2018年04月11日 - 14:04

最后更新:2018年04月11日 - 14:04

原始链接:/2018/04/11/panicdefer/

许可协议: Louis-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。