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