上一篇文章《Go语言开发基础系列(二十)panic函数的使用》我们介绍了如何使用panic函数让程序进行宕机,但是在实际的过程中,我们经常会涉及到宕机后的一系列操作,例如:
1、关掉资源 2、恢复程序 等等
所以这里的话我们就需要使用到这里的recover函数,整个revover函数的使用方法是:
defer func() { if err := recover(); err != nil { fmt.Println("执行了程序恢复的操作") } }()
一般这种结构都是固定的,只需要向里面填充具体的业务逻辑即可,下面我们演示下一个完整的revover函数使用示例:
// demo1 project main.go package main import ( "fmt" ) func main() { fmt.Println("进入了main函数") defer func() { if err := recover(); err != nil { fmt.Println("执行了程序恢复的操作:", err) } }() panic("演示宕机") }
然后我们看看结果:
可以看到只要发生了panic(宕机)那么就会去执行这里的recover函数。
下面再补充下panic和recover使用原则:
defer 需要放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。 recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用
最后我们再补充下panic与recover的关系:
如果有 panic 但没有 recover,那么程序会宕机。 如果有 panic 也有 recover,程序不会宕机,执行完对应的 defer 后,从宕机点退出当前函数后继续执行。 虽然 panic/recover 能模拟其他语言的异常机制,但并不建议在编写普通函数时也经常性使用这种特性。 在 panic 触发的 defer 函数内,可以继续调用 panic,进一步将错误外抛,直到程序整体崩溃。
还没有评论,来说两句吧...