Golang Recover提升程序的健壯性

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)
}

這個時候咱們若是執行程序就會獲得一個致命的錯誤,從而致使程序崩潰。因此這種方式是不取的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

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

期待與您一塊兒交流

白色底可愛幼稚微信公衆號底部二維碼.png

相關文章
相關標籤/搜索