go中的异常处理有三个关键字
defer panic recover
defer是用来解决异常发生之后有关资源的释放问题,抛出异常之后仍然会执行defer所作用的函数,可以用原来释放资源。
panic是用来抛出异常然后如果没有捕获异常的处理,就会导致程序终止。
应该养成比较好的习惯,就是每一个资源打开之后就使用defer关闭资源
import(
”fmt“
)
func main {
defer func() {
fmt.Println("After defer")
}()
file.Open(filepath)
defer file.Close() //习惯比较好
panic("terminate this programma")
fmt.Println("bye bye")
}
如果F的defer中无recover捕获,则将panic抛到G中,G函数会立刻终止,不会执行G函数内后面的内容,但不会立刻return,而调用G的defer...以此类推。F中出现panic时,F函数会立刻终止,不会执行F函数内panic后面的内容,但不会立刻return,而是调用F的defer,如果F的defer中有recover捕获,则F在执行完defer后正常返回,调用函数F的函数G继续正常执行。先设置
func G() {
defer func() {
fmt.Println("c")
}()
F()
fmt.Println("继续执行")
}
func F() {
defer func() {
if err := recover(); err != nil {
fmt.Println("捕获异常:", err)
}
fmt.Println("b")
}()
panic("a")
}
结果
捕获异常: a
b
继续执行
c
记住一定要在panic之后写上recover才可以捕捉相关的异常,所以其实可以再defer里面包含关于recover相关的内容