Go从入门到精通——函数——宕机(panic)——程序终止运行
宕机(panic)——程序终止运行
一、手动触发宕机
Go 语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失。
Go 语言程序在宕机时,会将堆栈和goroutine信息输出到控制台,所以宕机也可以方便地知晓发生错误的位置。
如何触发宕机呢?
package main
func main() {
panic("crash")
}
代码输出如下:
发生异常: panic
"crash"
Stack:
2 0x0000000000d9ef67 in main.main
at d:/go-testfiles/函数-宕机-手动触发宕机.go:4
以上代码中只用了一个内建的函数 panic() 就可以造成崩溃,panic() 的声明如下:
func panic(v interface{})
panic()参数可以是任意类型,后文将提到的 recover 参数会接收从 panic() 中发出的内容。
二、在运行依赖的必备资源缺失时主动触发宕机
regexp 是 Go 语言的正则表达式包,正则表达式需要编译后才能能使用,而且编译必须是成功的,表示正则表达式可用。
编译正则表达式函数有两种,具体如下:
1. func Compile(expr string)(*Regexp, error)
编译正则表达式,发生错误时返回编译错误,Regexp 为 nil,该函数适用于在编译错误时获得编译错误进行处理,同时继续后续执行的环境。
2. func MustCompile(str string) *Regexp
当编译正则表达式发生错误时,适用 panic 触发宕机,该函数适用于直接适用正则表达式而无须处理正则表达式错误的情况。
//编译正则表达式函数入口,输入包含正则表达式的字符串,返回正则表达式对象。
func MustCompile(str string) *Regexp {
//调用 Compile() 是编译正则表达式的入口函数,该函数返回编译好的正则表达式对象和错误
regexp, error := Compile(str)
if error != nil {
//判断如果有错误,就使用 panic() 触发宕机
panic(`regexp: Compile(` + quote(str) + `): `error.Error())
}
//没有错误时返回正则表达式
return regexp
}
三、在宕机时触发延迟执行语句
当 panic() 触发的宕机发生时,panic() 后面的代码将不会被运行,但是在 panic() 函数前面已经运行过的 defer 语句依然会在宕机发生时发生作用。
package main
import "fmt"
func main() {
defer fmt.Println("宕机后需要做的事情1")
defer fmt.Println("宕机后需要做的事情2")
panic("宕机")
}
代码输出如下:
Starting: D:\go-testfiles\bin\dlv.exe dap --check-go-version=false --listen=127.0.0.1:52828 from d:\go-testfiles
DAP server listening at: 127.0.0.1:52828
Type 'dlv help' for list of commands.
宕机后需要做的事情2
宕机后需要做的事情1
panic: 宕机
goroutine 1 [running]:
main.main()
d:/go-testfiles/函数-宕机-在宕机时触发延迟执行语句.go:8 +0x159