panic
文章发布较早,内容可能过时,阅读注意甄别。
在通常情况下,向程序使用方报告错误状态的方式可以是返回一个额外的 error 类型值。
但是,当遇到不可恢复的错误状态的时候,如数组访问越界、空指针引用等,这些运行时错误会引起 painc 异常。这时,上述错误处理方式显然就不适合了。反过来讲,在一般情况下,我们不应通过调用 panic 函数来报告普通的错误,而应该只把它作为报告致命错误的一种方式。当某些不应该发生的场景发生时,我们就应该调用 panic。
一般而言,当 panic 异常发生时,程序会中断运行,并立即执行在该 goroutine(可以先理解成线程,在中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括 panic value 和函数调用的堆栈跟踪信息。
不是所有的 panic 异常都来自运行时,直接调用内置的 panic 函数也会引发 panic 异常;panic 函数接受任何值作为参数。
# 1,显示调用 panic 函数。
package main
import "fmt"
func testa() {
fmt.Println("aaaaaa")
}
func testb() {
//fmt.Println("bbbbb")
//显式调用panic函数,导致程序中断
panic("this is a panic test")
}
func testc() {
fmt.Println("ccccc")
}
func main() {
testa()
testb()
testc()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 2,数组越界导致 panic。
package main
import "fmt"
func testa() {
fmt.Println("aaaaaa")
}
func testb(x int) {
var a [10]int
a[x] = 111 //当x为20的时候,会导致数组越界,产生一个panic,导致程序崩溃
}
func testc() {
fmt.Println("ccccc")
}
func main() {
testa()
testb(20)
testc()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
上次更新: 2024/11/19, 23:11:42