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
CCBBDDBBAAc