在GO
语言中goroutine
的开启是很方便的只须要一个关键词go func()
就能够开启一个协程。可是在协程中咱们可能会遇到一些致命的错误,若是这个时候咱们没有对这个错误进行处理,那么整个程序就会崩溃。而在Go
中为解决这个问题提供了一个recover
函数来处理。
先来看一个不使用recover的示例
var wait sync.WaitGroup func 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) }
这个时候咱们若是执行程序就会获得一个致命的错误,从而致使程序崩溃。因此这种方式是不取的golang
panic: work error goroutine 6 [running]: main.Worker(0x0) D:/golang/test/main.go:25 +0x139 created by main.main D:/golang/test/main.go:12 +0x62
下面对上面的程序进行改写,增长recoer的使用
var wait sync.WaitGroup func 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 1 number is 0 and some get wrong
因此咱们在使用go协程的时候应该尽可能都对panic进行recover操做,防止整个程序的崩溃函数