Go 语言开发的程序遇到错误,比较常见的做法是返回 error 给调用者,但对于危险的操作,比如内存越界,则会显示触发panic。
同样是退出程序,与 os.Exist 相比,panic 退出的方式比较优雅,panic 会做一定的善后动作,比如处理 defer函数以及支持使用 recover 消除 panic。
工作流程:
image.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







网友评论