讨论的是panic问题。对于Go语言新手来说,在使用error的时候存在一些疑惑。在Go语言中,error通常作为方法或函数的最后一个返回参数。有人可能想采用Java或Python语言中的panic和recover机制来处理异常。Go中也是有异常捕获recover机制的,现在来我们来看在什么场景下使用panic和recover.
panic会终止代码执行逻辑
panic语句会终止代码执行,即fmt.Println("b")不会被执行
.
func main() {
fmt.Println("a")
panic("foo")
fmt.Println("b")
// panic之后的内容不会输出,类似于linux中的exit函数功能,程序直接退出
}
上面程序输出如下:
a
panic: foo
goroutine 1 [running]:
main.main()
main.go:7 +0x95
exit status 2
panic异常执行流程
panic语句被执行后,异常执行流程有两种情况。情况1:panic没有被recover,执行逻辑将沿调用栈返回,直到goroutine退出。情况2:panic被recover捕获结束。
-
panic没有被捕获
下面的panic语句执行后,因为没有被捕获,所以沿着调用栈 main->fa->fb->fc 一路返回到到main中,然后程序直接退出了,main中的fd不会输出。因为在Go中,「如果一个goroutine panic了,而且这个goroutine里面没有捕获recover,那么整个进程就会