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

这个时候我们如果执行程序就会得到一个致命的错误,从而导致程序崩溃。所以这种方式是不取的

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


发表评论

电子邮件地址不会被公开。 必填项已用*标注