Go语言学习笔记:7.4 panic与recover
概念
panic
与recover
是Go的两个内置函数,这两个内置函数用于处理Go运行时的错误,panic
用于主动抛出错误,recover
用来捕获panic
抛出的错误。
- 引发
panic
有两种情况,一是程序主动调用,二是程序产生运行时错误,由运行时检测并退出。 - 发生
panic
后,程序会从调用panic
的函数位置或发生panic
的地方立即返回,逐层向上执行函数的defer
语句,然后逐层打印 函数调用堆栈,直到被recover
捕获或运行到最外层函数。 panic
不但可以在函数正常流程中抛出,在defer
逻辑里也可以再次调用panic
或抛出panic
。defer
里面的panic
能够被后 续执行的defer
捕获。recover
用来捕获panic
,阻止panic
继续向上传递。recover()
和defer
一起使用,但是defer
只有在后面的函数体内直接 被掉用才能捕获panic
来终止异常,否则返回nil
,异常继续向外传递。
例子1
//以下捕获失败
defer recover()
defer fmt.Prinntln(recover)
defer func(){
func(){
recover() //无效,嵌套两层
}()
}()
//以下捕获有效
defer func(){
recover()
}()
func except(){
recover()
}
func test(){
defer except()
panic("runtime error")
}
例子2
多个panic
只会捕捉最后一个:
package main
import "fmt"
func main(){
defer func(){
if err := recover() ; err != nil {
fmt.Println(err)
}
}()
defer func(){
panic("three")
}()
defer func(){
panic("two")
}()
panic("one")
}
使用场景
一般情况下有两种情况用到:
- 程序遇到无法执行下去的错误时,抛出错误,主动结束运行
- 在调试程序时,通过
panic
来打印堆栈,方便定位错误
其他要说的
go panic与recover分析及错误处理:https://blog.csdn.net/a41888313/article/details/79691728