您的位置 首页 php

使用recover捕获panic,请注意这个坑

11a0f53dbcad49c89962673df8f2c13f

程序异常是程序编写中经常遇到的问题,在PHP、Java中,我们可以使用try……catch……来捕获异常。在Golang中,虽然没有try……catch……,但是我们也可以通过defer和recover两个函数来模拟它的功能。如下:

42a792eaa42540e2945fdfbec534b311

不过,有个坑我们需要。那就是,在Golang中,我们常常使用不同的协程来处理不同任务,但是recover只能恢复所在协程里的panic,而其他协程里的panic,则不能恢复,如下:

1a5c96b917414d1f9e07feffd105a242

上面这段代码就无法完整执行下去,因为其中一个协程必然会发生panic,这样就导致整个应用挂掉,其它协程也停止执行。

Go的Web服务也是这样,默认的recover机制只能捕获一层,如果你在这个请求的处理中又使用了其它协程,那么必须非常慎重,因为只要发生一个panic,整个Web服务就会挂掉。

所以,为保证你的应用万无一失,理论上讲,所有使用协程的地方都必须做defer recover处理。不过开发中也要根据实际情况来决定,对于一些不可能出错的函数加了可能还影响性能。

文章来源:智云一二三科技

文章标题:使用recover捕获panic,请注意这个坑

文章地址:https://www.zhihuclub.com/43640.shtml

关于作者: 智云科技

热门文章

网站地图