首页 > 编程笔记 > Go语言笔记 阅读:6

Go语言panic():触发宕机(附带实例)

在 Go 语言中,程序在编译时可能捕获到一些错误。有些错误只能在运行时出现,例如数组访问越界、空指针引用等,这些运行时出现的错误都会引起宕机(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

根据运行结果分析代码的执行流程如下:
在触发 panic 后执行的 defer 语句内还可以继续触发 panic,进一步抛出异常,直到程序整体崩溃。

相关文章