Golang Recover提高程序的健壮性

旧梦发癫 · · 614 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:旧梦发癫

查看原文:Golang Recover提高程序的健壮性

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

614 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传