在GO
语言中goroutine
的开启是很方便的只需要一个关键词go func()
就可以开启一个协程。但是在协程中我们可能会遇到一些致命的错误,如果这个时候我们没有对这个错误进行处理,那么整个程序就会崩溃。而在Go
中为解决这个问题提供了一个recover
函数来处理。
不使用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)
}
这个时候我们如果执行程序就会得到一个致命的错误,从而导致程序崩溃。所以这种方式是不取的
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
使用recover
下面对上面的程序进行改写,增加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操作,防止整个程序的崩溃
期待与您一起交流
有疑问加站长微信联系(非本文作者)