在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操做,防止整個程序的崩潰函數