GoPanic函数

Posted yuxiaoba

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GoPanic函数相关的知识,希望对你有一定的参考价值。

  panic(运行时恐慌)是一种只会在程序运行时才回抛出来的异常。在panic被抛出之后,如果没有在程序里添加任何保护措施的话,程序就会在打印出panic的详情,终止运行。

  举个栗子

package main

func main() {
    s1 := []int{0, 1, 2, 3, 4}
    e5 := s1[5]
    _ = e5
}

  运行上面的代码,会抛出panic

panic: runtime error: index out of range

goroutine 1 [running]:   //Id为1的goroutine在此panic被引发时正在运行
main.main()
 /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q0/demo47.go:5 +0x3d  //此行代码在其所属源码文件中的行数,以及源码文件的绝对路径, +03d是计数偏移量,用处不大。
exit status 2  //以退出状态码2结束运行,一般状态不为0时表示程序非正常退出

 

 从Painc被引发到程序终止运行的大致过程是怎样的?

  某个函数中的某行代码引发了一个panic后,初始的panic详情会被建立起来,并且该程序的控制器会立即从此行代码转移到调用其所属函数的那行代码上(调用栈中的上一级),此行代码所属函数的执行随即终止。紧接着,控制权并不会在此有片刻停留,它又会立即转移至上一级的调用代码处,反方向传播直至最外层函数(go函数,对于主goroutine来说就是main函数)。但是控制器也不会停留在那里,而是被Go语言运行时系统收回。随后程序奔溃并终止运行,承载程序这次运行的进程也会随之死亡并消失。与此同时,在这个控制器传播过程中,panic详情会积累和完善,并在程序终止之前打印出来。

//main函数调用了caller1函数,caller1函数调用了caller2函数
goroutine 1 [running]:
main.caller2()
 /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:22 +0x91
main.caller1()
 /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:15 +0x66
main.main()
 /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:9 +0x66
exit status 2

 

以上是关于GoPanic函数的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段8——声明函数

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

在 Visual Studio 中创建构造函数的代码片段或快捷方式

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

web代码片段

C#常用代码片段备忘