GoLangpanic defer recover 深入理解
Posted junneyang 的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GoLangpanic defer recover 深入理解相关的知识,希望对你有一定的参考价值。
先等我想清楚golang错误处理
为什么要这么设计的时候
再来更新。。。
Golang这么时尚的语言是没有类似try..catch 这种异常处理机制,而是使用 panic 和 recover处理异常. 其实相当于python的raise。
golang的异常处理组合 panic,defer,recover,跟java中的try catch finially是类似的。 但是从语言的用户体验来说,不怎么好。 但考虑到golang的场景基本是系统高性能层面的,这种精准错误处理应该减少那种后遗症bug。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。
使用panic抛出异常,抛出异常后将立即停止当前函数的执行并运行所有被defer的函数,然后将panic抛向上一层,直至程序carsh。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃,recover只有被defer后才是有意义的。
必须注意:
1. defer 需要放在 panic 之前定义,另外recover只有在 defer 调用的函数中才有效。
2. recover处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点.
3. 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用
panic (主动爆出异常) 与 recover (收集异常)
recover 用来对panic的异常进行捕获. panic 用于向上传递异常,执行顺序是在 defer 之后。
我们举个含有异常的例子:
1
2
3
4
5
6
7
8
9
10
11
12
|
#xiaorui.cc
func f() {
for {
fmt.Println("1")
a := []string{"a","b"}
fmt.Println(a[3]) // 这里slice越界异常了
/*panic("bug")*/
fmt.Println("4")
time.Sleep(1 * time.Second)
}
}
|
如果你不把这个异常panic recover处理的化,那么就会发生下面的情况.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#xiaorui.cc
1
panic: runtime error: index out of range
goroutine 1 [running]:
panic(0xda9c0, 0x8201c8090)
/usr/local/go/src/runtime/panic.go:464 +0x3e6
main.f()
/Users/ruifengyun/gg.go:23 +0x33b
main.main()
/Users/ruifengyun/gg.go:16 +0x14
exit status 2
|
下面是处理panic的例子.
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
|
package main
import (
"fmt"
"time"
)
func main() {
defer func() { //必须要先声明defer,否则不能捕获到panic异常
fmt.Println("2")
if err := recover(); err != nil {
fmt.Println(err) //这里的err其实就是panic传入的内容,bug
}
fmt.Println("3")
}()
f()
}
func f() {
for {
fmt.Println("1")
panic("bug")
fmt.Println("4") //不会运行的.
time.Sleep(1 * time.Second)
}
}
|
那么上面代码的运行结果是:
1
2
3
4
5
|
1
2
bug
3
|
上面go代码实例中,异常是我们通过panic方法主动抛出来的,但如果真的就出现了未知的异常咋办?
上面go代码运行结果是:
1
2
3
4
5
6
|
1
xiaorui.cc start
runtime error: index out of range
xiaorui.cc end
end
|
先前没在意defer recover panic的注意事项,结果各种问题出现了。 不知道go以后会不会有try catch异常模式, 很是期待…
END.
参考资料:
http://xiaorui.cc/2016/03/09/%E5%85%B3%E4%BA%8Egolang%E7%9A%84panic-recover%E5%BC%82%E5%B8%B8%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86/
http://www.linuxidc.com/Linux/2013-04/83105.htm
http://blog.csdn.net/wuwenxiang91322/article/details/9042503
以上是关于GoLangpanic defer recover 深入理解的主要内容,如果未能解决你的问题,请参考以下文章