Go 语言开发的程序遇到错误,比较常见的做法是返回 error 给调用者,但对于危险的操作,比如内存越界,则会显示触发panic
。
同样是退出程序,与 os.Exist
相比,panic
退出的方式比较优雅,panic
会做一定的善后动作,比如处理 defer
函数以及支持使用 recover
消除 panic
。
工作流程:
![](https://img.haomeiwen.com/i7304940/a64d5253d6d22770.png)
在panic 执行过程中有几个要点注意:
- panic 会递归执行是协程中所有的
defer
,与函数正常退出时的执行顺序一致。 - panic 不会处理其他协程中的
defer
。 - 当前协程中的
defer
处理完成之后,触发程序退出。 - 如果在panic 的执行过程中任意一个defer 函数执行了 recover(),那么 panic 的处理流程就会终止。
- 如果在 panic 函数中再次发生了 panic,程序立即终止当前 defer 函数的执行,然后继续执行接下来的 panic 流程,只是当前 defer 函数中 panic 后面的语句就没有机会执行。
panic 实际实现是/src/runtime/panic.go:gopanic
数据结构
TODO
没有defer 函数
TODO
defer 函数处理
TODO
嵌套panic
TODO
网友评论