Golang-Recover提高程序的健壮性

39次阅读

共计 946 个字符,预计需要花费 3 分钟才能阅读完成。

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 操作,防止整个程序的崩溃

期待与您一起交流

正文完
 0