Go Panic 的触发及恢复过程
- Panic 过程
- recover 函数
- defer 函数
Panic 过程
- 当代码触发
panic
的时候,panic详情
就会被初始化。随后程序的控制权从最底端的调用函数一级一级向上传递到最顶端的调用函数。 - 到了最顶端调用函数后,控制权会被移交给 Go 语言的运行时系统,Go 语言的运行时系统打印出
panic详情
,并结束程序的运行。 - 在控制权传递的过程中
panic详情
会被逐渐积累起来。所以最后程序输出panic详情
的时候,会从最底端的函数一直输出到最顶端的函数。我们查看调用栈的信息的时候,应该从底部exit status 2
这一行向上看。
recover 函数
- 因为
panic
发生的时候,panic
函数后面的语句都不会执行了,所以recover
函数不能放在panic
语句后面执行,而要放在defer
函数中执行。
defer 函数
- defer 函数的执行顺序和它的定义顺序是完全相反的
- defer 语句每次执行的时候,Go 会把它携带的 defer 函数及其参数值存储到另一个栈中,这个栈是遵循 FILO(First Input Last Output)原则的。
- defer 函数中也可以引发
panic
,这样可以把recover
捕获的panic
包装一下再抛出去。
2019年04月08日 / 22:14