在
GO
语言中goroutine
的开启是很方便的只需要一个关键词go func()
就可以开启一个协程。但是在协程中我们可能会遇到一些致命的错误,如果这个时候我们没有对这个错误进行处理,那么整个程序就会崩溃。而在Go
中为解决这个问题提供了一个recover
函数来处理。
不使用recover
先来看一个不使用recover的示例
var wait sync.WaitGroupfunc main() { wait.Add(2) go Worker(0) go Worker(1) wait.Wait()}func Worker(number int) { defer func() { wait.Done() }() if number ==0 { panic("work error") } fmt.Printf("number is %d\r\n",number)}
这个时候我们如果执行程序就会得到一个致命的错误,从而导致程序崩溃。所以这种方式是不取的
panic: work errorgoroutine 6 [running]:main.Worker(0x0) D:/golang/test/main.go:25 +0x139created by main.main D:/golang/test/main.go:12 +0x62
使用recover
下面对上面的程序进行改写,增加recoer的使用
var wait sync.WaitGroupfunc main() { wait.Add(2) go Worker(0) go Worker(1) wait.Wait()}func Worker(number int) { defer func() { if err := recover() ; err != nil{ fmt.Printf("number is %d and some get wrong\r\n",number) } wait.Done() }() if number ==0 { panic("work error") } fmt.Printf("number is %d\r\n",number)}
这个时候我们就会得到一个错误的提示,而不是直接得到一个致命的错误.
number is 1number is 0 and some get wrong
所以我们在使用go协程的时候应该尽量都对panic进行recover操作,防止整个程序的崩溃
期待与您一起交流
文章来源:智云一二三科技
文章标题:Golang Recover提高程序的健壮性
文章地址:https://www.zhihuclub.com/6721.shtml