Golang不是面向对象语言,也没有try ... catch... 或者 try ... exception... 结构。
Golang语言使用panic、recover,配合着defer,来完成类似功能。
defer本身用处很多,比如延后执行(函数结束时候才执行)。看个例子:
package main
import "fmt"
func main() {
var i int
defer fmt.Println("end")
fmt.Println("begin: 0")
i++
fmt.Println(i)
}
//输出结果:
begin: 0
1
end
panic和recover的需要注意几点:
- defer 需要放在 panic 之前定义,另外recover只有在 defer 调用的函数中才有效
- recover处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点
- 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用
看个例子:
package main
import (
"fmt"
"time"
)
func main() {
f()
fmt.Println("end")
}
func f() {
defer func() {
fmt.Println("start defer part")
if err := recover(); err != nil {
fmt.Println("err: ",err)
}
fmt.Println("end defer part")
}()
for {
fmt.Println("func begins")
a := []int{1,2}
fmt.Println(a[3])
panic("bug occurs")
fmt.Println("func ends")
time.Sleep(1 * time.Second)
}
}
//执行结果:
func begins
start defer part
err: runtime error: index out of range
end defer part
end
程序执行结果,貌似往panic里面扔什么字符串都没关系... 反正没被引出来。
不管前面错不错,它就是强行触发,执行退出(defer操作... )...
具体错误信息,从recover()里面读出来。如果没出错,则不读出...
当前理解如此,后面如有新体会,则续写本帖。