Go中的Exception处理采用什么机制?
一句话总结:
Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。
package main
import "fmt"
func main() {
defer func() { // 必须要先声明defer,否则不能捕获到panic异常
fmt.Println("1")
if err := recover(); err != nil {
fmt.Println(err) // 这里的err其实就是panic传入的内容,the program is crashed
}
fmt.Println("2")
}()
ftest()
f()
}
func f() {
fmt.Println("b")
panic("the program is crashed")
fmt.Println("c")
}
func ftest() {
defer fmt.Println("AA")
defer fmt.Println("BB")
fmt.Println("CC")
return
fmt.Println("DD")
}
你可能跟我第一次一样,脑海里有如下疑问:
- Q1 : defer什么时候执行?
- Q2 : 程序中多个defer关键字,按什么顺序执行?
- Q3 : recover恢复后,程序*会不会返回到异常发生的地方继续朝下运行?
咱们根据执行结果逐个回答?
CC
BB
AA
b
1
the program is crashed
2
A1 : CC
打印完后程序return,然后打印BB
,说明函数返回前增加defer语句的执行,不打印DD
,说明defer必须写在程序return前才会在返回前增加执行
A2 : 先打印BB
后打印AA
,说明defer执行顺序为后声明的先执行
A3 : 程序不打印c
,说明recover恢复后程序*不会返回到异常发生的地方继续朝下运行
Reference:
http://www.cnblogs.com/ghj1976/archive/2013/02/11/2910114.html
有疑问加站长微信联系(非本文作者)