go语言recover函数的线程恢复机制用法,及捕获panic实例
go语言中recover函数的作用
- 恢复因为异常(恐慌)而中止的goroutine(轻量级线程);
- recover函数仅在延迟函数defer中有效,在其他的程序当中调用的话会返回nil(空值);
- 当异常(恐慌)在程序中发生,则recover可以捕获panic的输入值,并恢复线程。
这里应该注意一个问题:什么是defer延迟函数,要知道defer并不是go的内建函数,那这到底是什么呢?我们接着往下看一个实例。
recover()函数实例
package main
import "fmt"
func panicfunc() {
a := 1
if a == 1 {
panic("抛出异常(恐慌)")
}
}
func recoverfunc() {
//用匿名函数声明一个defer函数
defer func() {
recover_panic := recover()
if recover_panic != nil {
fmt.Printf("捕获%v \n", recover_panic)
}
}() //匿名函数的调用()不能省略
panicfunc()
fmt.Println("函数内panic后的程序是否也被执行了?")
}
func main() {
recoverfunc()
fmt.Println("如果这一行执行了,说明异常抛出并被recover()函数捕获后,线程得到了恢复。")
}
代码输出:
捕获抛出异常(恐慌)
如果这一行执行了,说明异常抛出并被recover()函数捕获后,线程得到了恢复。
代码解析
如上代码,panic抛出异常(恐慌),被defer延迟函数recover()函数捕获之后,线程得以恢复,大家可以参考上一节中的panic实例,可知没有recover()函数对异常的捕捉,panic执行完defer语句之后,程序就停止了,就上上一节的y1()函数并没有被执行,而使用recover就显然不同,这一点跟python的异常捕捉try...excerpt语句十分相似。
需要注意的一点是,在函数内部,发生异常(恐慌)panic后的程序并没有被执行,如上面panicfunc()调用后的fmt.Println()并没有输出(被执行)。