在go中,使用panic来抛出一个错误并将程序停止。
一般有主动panic和被动panic两种情况。
对于主动panic,可以是当一个程序启动时如果需要的依赖程序没有启动就将这个启动停掉,比如没有开etcd或mysql等,例如:
func main() {
ismysql := false; // 模拟mysql未启动的场景
if !ismysql {
panic("mysql 未启动")
}
}
运行之后会得到如下结果:
panic: mysql 未启动
goroutine 1 [running]:
main.main()
C:/gostudy/20250704/exe1/exe1.go:6 +0x25
exit status 2
对于被动panic的情况,如果不想要让程序退出可以使用recover来接受这个panic,之后可以选择打印或者做其他处理,并且程序是保持运行的。例如:
var mp map[string]string
func A() {
defer func() {
r := recover()
fmt.Println("捕获到panic", r)
}()
mp["heky"] = "heky" // 在不用make或者初值初始化的情况下程序会报panic
}
func main() {
A()
fmt.Println("程序继续运行,未退出")
}
运行之后会得到如下结果:
捕获到panic assignment to entry in nil map
程序继续运行,未退出
这里需要注意的是如果要使用recover来捕获panic,recover必须在一个defer后面跟着的匿名函数中,并且这个recover必须在panic之前(因为在panic之后就是不可达的)。