参考:
李文周的博客
Go语言中目前(Go1.12)是没有异常机制,但是使用panic/recover模式来处理错误。
panic可以在任何地方引发,但recover只有在defer调用的函数中有效。
func a(){
println("func a")
}
func b(){
panic("panic in b")//使用panic引发错误,发生错误后,崩溃然后异常退出
}
func c(){
println("func c")
}
func main(){
a()
b()
c()
}
PS:个人感觉有些像python里的 try{…}except{…}
func a(){
println("func a")
}
func b(){
defer func(){//在可能发生错误的代码之前使用。
err := recover()//recover 用来收集错误,再赋给err
if err!=nil{//err 为 nil的话,说明没有发生错误。否则发生了错误。
println("func b err")
}
}()//注意要加()才会执行
panic("panic in b")//使用panic引发错误
}
func c(){
println("func c")
}
func main(){
a()
b()
c()
}
注意:
- recover()必须搭配defer使用。
- defer一定要在可能引发panic的语句之前定义。
defer 语句
Go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,
先被defer的语句最后被执行,最后被defer的语句,最先被执行。
举个例子:
func main() {
fmt.Println("start")
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
fmt.Println("end")
}
输出结果:
start
end
3
2
1
defer 执行时机
在Go语言的函数中return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而defer语句执行的时机就在返回值赋值操作后,RET指令执行前。