go语言panic函数详解

2023年1月31日10:58:21

程序异常被叫做panic,直译为运行时恐慌
当panic被抛出异常后,如果我们没有在程序中添加任何保护措施的话,程序就会打印出panic的详细情况之后,终止运行


panic: runtime error: index out of range

goroutine 1 [running]:
main.main()
D:/go_workspace/Golang_Puzzlers/src/puzzlers/article19/q0/demo47.go:5 +0x11

这份异常的第一个信息是panic: runtime error: index out of range其中的runtime error的含义是,这是一个runtime代码中抛出的panic,在这个panic中,包含了一个runtime.Error接口类型的值。runtime.Error接口内嵌了error接口并做了一点扩展
此外,panic 详情中一般还会包含与它的引发原因有关的 goroutine 的代码执行信息。正如前述详情中的“goroutine 1 [running]”,它表示有一个 ID 为1,这里的id并不重要,因为它只是go语言运行时系统内部给与的一个goroutine编号。
“main.main()”表明了这个 goroutine 包装的函数就是命令源码文件中的那个函数,也就是说这里的 goroutine 正是主 goroutine。再下面的一行,指出的就是这个 goroutine 中的哪一行代码在此 panic 被引发时正在执行。
最后一行+0x3d代表的是:此行代码相对于其所属函数的入口程序计数偏移量。不过,一般情况下它的用处并不大。
“exit status 2”表明我的这个程序是以退出状态码结束运行的。在大多数操作系统中,只要退出状态码不是,都意味着程序运行的非正常结束。在 Go 语言中,因 panic 导致程序结束运行的退出状态码一般都会是。


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

  • 作者:java圈
  • 原文链接:https://blog.csdn.net/zhangchangbin123/article/details/85675329
    更新时间:2023年1月31日10:58:21 ,共 1138 字。