go语言panic内建函数的用法,及实例
go语言的异常机制
go语言没有异常的相关机制,这一点与python有很大的不同,不过go有panic和recover这样的内建函数,可以简单理解为python的异常的抛出和捕捉的机制。不过,在go语言里头,用panic的地方不多,有文档中介绍说,panic和recover的机制是不得不用的时候才用,尽量少用。这一节,我们先来介绍panic函数及其机制用法。
panic函数的用法
在具体介绍panic( arg )函数的用法之前,我们先来看一个panic的实例:
package main
import "fmt"
func panicfunc() {
var a int
fmt.Println("这是正常语句!")
defer fmt.Println("这是延迟语句!")
if a == 0 {
panic("这是panic语句。")
}
fmt.Println("同一个函数中,panic后面的语句也不会被执行!")
}
func x1() {
fmt.Println("这是x1函数!")
}
func y1() {
fmt.Println("这是y1函数!")
}
func z1() {
fmt.Println("这是z1函数,包含panicfunc函数!")
panicfunc()
}
func main() {
x1()
z1()
y1()
}
代码输出:
这是x1函数!
这是z1函数,包含panicfunc函数!
这是正常语句!
这是延迟语句!
panic: 这是panic语句。
goroutine 1 [running]:
main.panicfunc()
/yourpath/
main.z1()
/yourpath/
main.main()
/yourpath/
exit status 2
panic的运行机制
如上代码,及其相关的输出内容,我们可以发现一些panic的规律:
- panic函数被调用之后,panic后面的代码不会执行,包括同一个函数内的和其他函数的;
- panic调用之后,defer延迟语句仍然会被执行,而且是先于panic的输出内容;
- panic函数抛出的“异常”,一般翻译成“恐慌”,会一层一层地往外抛出,先是panicfunc()函数本身,然后调用该函数的z1()函数,再然后是最外层的main()函数。
除此之外,go语言的“异常”可以通过调用panic函数产生,也可以因为go程序的运行错误而产生。