go语言recover函数的线程恢复机制用法,及捕获panic实例

go语言中recover函数的作用

  1. 恢复因为异常(恐慌)而中止的goroutine(轻量级线程);
  2. recover函数仅在延迟函数defer中有效,在其他的程序当中调用的话会返回nil(空值);
  3. 当异常(恐慌)在程序中发生,则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()并没有输出(被执行)。



全栈后端 / go语法 :













Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.