Go语言panic():触发宕机(附带实例)
在 Go 语言中,程序在编译时可能捕获到一些错误。有些错误只能在运行时出现,例如数组访问越界、空指针引用等,这些运行时出现的错误都会引起宕机(panic)。当宕机发生时,程序停止运行,编译器输出对应的报错信息。
panic() 是 Go语言的内置函数。它类似于其他编程语言中抛出异常的 throw 语句。panic() 一般用在函数内部。
panic() 函数的语法格式如下:
在手动触发宕机时,堆栈和 goroutine 信息将输出到控制台,所以通过宕机也可以方便地查找发生错误的位置,有利于及时排查和解决问题。
代码如下:
代码如下:
在触发 panic 后执行的 defer 语句内还可以继续触发 panic,进一步抛出异常,直到程序整体崩溃。
panic() 是 Go语言的内置函数。它类似于其他编程语言中抛出异常的 throw 语句。panic() 一般用在函数内部。
panic() 函数的语法格式如下:
func panic(v interface{})panic() 函数的参数可以是任意类型的值。
手动触发宕机
在程序中可以手动触发宕机使程序崩溃,这样可以使开发者及时发现错误,减少可能的损失。在手动触发宕机时,堆栈和 goroutine 信息将输出到控制台,所以通过宕机也可以方便地查找发生错误的位置,有利于及时排查和解决问题。
代码如下:
package main func main() { panic("Program crash") }运行结果如下:
panic: Program crash
goroutine 1 [running]:
main.main()
e:/Code/10/demo.go:4 +0x27
exit status 2
宕机时触发defer语句
当调用函数执行到 panic() 时,不执行 panic() 后面的代码,如果在 panic() 函数前面有 defer 语句则正常执行该语句,之后返回调用函数,执行每一层的 defer 语句,直到所有正在执行的函数都被终止为止。代码如下:
package main import "fmt" func test() { defer func() { fmt.Println("exit func test") }() panic("Program crash") // 触发宕机 } func main() { defer func() { fmt.Println("exit func main") }() test() // 运行代码不会执行 fmt.Println("不会执行") }运行结果如下:
exit func test
exit func main
panic: Program crash
goroutine 1 [running]:
main.main()
e:/Code/10/demo.go:9 +0x49
main.test()
e:/Code/10/demo.go:15 +0x3f
exit status 2
- 执行 test() 函数中的 panic 触发宕机;
- 宕机前,优先执行 defer 语句。由于test()函数内的匿名函数通过 defer 语句延迟执行,因此在触发宕机后,执行 test() 函数中的匿名函数,打印“exit func test”;
- 由于主函数内的匿名函数通过 defer 语句延迟执行,因此在主函数退出前将执行其中的匿名函数,打印“exit func main”;
- 打印抛出的 panic 并退出程序。
在触发 panic 后执行的 defer 语句内还可以继续触发 panic,进一步抛出异常,直到程序整体崩溃。