知识卡片
Panic沿栈展开
内容
panic 会沿调用栈向上展开,依次触发已注册的 defer。它适合处理不可继续的异常路径,但不应替代普通错误返回,否则控制流会变得难以局部推理。
参考来源
- 位置:《Go语言底层原理剖析》第11章《异常与异常捕获》11.1节《panic函数使用方法》
- 结论依据:原文明确"Go程序在panic时并不会像大多数人想象的一样导致程序异常退出,而是会终止当前函数的正常执行,执行defer函数并逐级返回。例如,对于函数调用链a()→b()→c(),当函数c发生panic后,会返回函数b。此时,函数b也像发生了panic一样,返回函数a",因此可以推出"panic 沿调用栈逐级向上展开、依次触发各层已注册的 defer"的结论。
- 原始内容:Go程序在panic时并不会像大多数人想象的一样导致程序异常退出,而是会终止当前函数的正常执行,执行defer函数并逐级返回。例如,对于函数调用链a()→b()→c(),当函数c发生panic后,会返回函数b。此时,函数b也像发生了panic一样,返回函数a。在函数c、b、a中的defer函数都将正常执行。