色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

golang recover函數(shù)使用中的一些坑解析

瀏覽:108日期:2022-06-06 16:04:25
目錄
  • 正文
  • 一,正常情況下
  • 二, goroutine中panic 
  • 三,間接調(diào)用recover
  • 四,nil panic
  • 五,總結(jié)

正文

眾所周知golang 中recover函數(shù)可以捕捉panic,防止在出現(xiàn)異常的情況下服務(wù)整個(gè)不可用。然而某些情況下recover也無(wú)法catch panic。下面就會(huì)說(shuō)一些這些情況。

一,正常情況下

package?main
import?"fmt"
func?main(){
????defer?func(){
????????if?err?:=?recover();err?!=?nil{
????????????fmt.Printf("err?=?%v",err)
????????}
????}()
????panic("a?panic")
}
打印結(jié)果:
err?=?a?panic
Process?finished?with?exit?code?0

能正常catch panic

二, goroutine中panic 

之前線上環(huán)境出現(xiàn)過(guò)接口出現(xiàn)panic導(dǎo)致服務(wù)不可用的情況,于是同事就直接在main函數(shù)加了個(gè)recover認(rèn)為萬(wàn)事無(wú)憂了。實(shí)際上recover并不能捕捉到協(xié)程中的panic。

package?main
import?"fmt"
func?main(){
????defer?func(){
????????if?err?:=?recover();err?!=?nil{
????????????fmt.Printf("err?=?%v",err)
????????}
????}()
????go?func(){
????????panic("a?panic")
????}()
????select{}
}
打印結(jié)果:
panic:?a?panic
goroutine?6?[running]:
main.main.func2()
????I:/goProject/catchPanic.go:13?+0x40
created?by?main.main
????I:/goProject/catchPanic.go:12?+0x5e

實(shí)際上還是會(huì)panic導(dǎo)致服務(wù)不可用。

正確寫法

package?main
import?"fmt"
func?main(){
????go?func(){
????????defer?func(){
????????????if?err?:=?recover();err?!=?nil{
????????????????fmt.Printf("err?=?%v",err)
????????????}
????????}()
????????panic("a?panic")
????}()
????select?{}
}
返回值:
fatal?error:?all?goroutines?are?asleep?-?deadlock!
goroutine?1?[select?(no?cases)]:
main.main()
????I:/goProject/catchPanic.go:15?+0x41
err?=?a?panic
Process?finished?with?exit?code?2

可以看到panic被正常捕捉,同時(shí)因?yàn)閟elect語(yǔ)句陷入阻塞,報(bào)了一個(gè)死鎖的錯(cuò)。

三,間接調(diào)用recover

在我想要把recover封裝成成一個(gè)函數(shù)的時(shí)候,發(fā)現(xiàn)recover并沒(méi)有生效,因?yàn)閞ecover只有在被defer語(yǔ)句直接調(diào)用的時(shí)候才會(huì)生效。當(dāng)recover在其他函數(shù)內(nèi)部的時(shí)候無(wú)法正確捕捉到panic。

package?main
import?"fmt"
func?main(){
????defer?cover()
????panic("a?panic")
}
func?cover(){
????defer?func(){
????????if?err?:=?recover();err!=?nil{
????????????fmt.Println(err)
????????}
????}()
}
返回值:
panic:?a?panic
goroutine?1?[running]:
main.main()
????I:/goProject/catchPanic.go:7?+0x62

四,nil panic

panic要被捕捉,還需要滿足一種條件,就是panic不是nil panic,否則在進(jìn)行捕獲判斷的時(shí)候無(wú)法知道是panic沒(méi)有發(fā)生還是panic本身就是nil。

例如以下代碼

package?main
import?"fmt"
func?main()?{
????defer?func(){
????????if?err?:=?recover();err?!=?nil{
????????????fmt.Println(err)
????????}
????????fmt.Println("after?recover")
????}()
????panic(nil)
????select{}
}
返回值:
after?recover

recover并沒(méi)有正確處理異常,因?yàn)楫惓5闹禐閚il。

五,總結(jié)

這篇文章講述了三種recover會(huì)失效的情況。

  •  攜程中出現(xiàn)panic
  • defer不直接調(diào)用recover
  • panic的值為nil值

寫代碼的時(shí)候需要注意避免因?yàn)檫@幾種情況的出現(xiàn)而導(dǎo)致服務(wù)不可用。以上就是golang新手常遇見的一些坑。

以上就是golang recover函數(shù)使用中的一些坑解析的詳細(xì)內(nèi)容,更多關(guān)于golang recover函數(shù)坑的資料請(qǐng)關(guān)注其它相關(guān)文章!

標(biāo)簽: PHP
主站蜘蛛池模板: 在线播放国产真实女同事 | 欧美视频在线观 | 亚洲精品国产拍拍拍拍拍 | 久久99精品九九九久久婷婷 | 免费一级毛片在线播放 | 国内自拍视频在线看免费观看 | 欧美xxxx在线视频 | 九九热久久免费视频 | 欧美成人三级视频 | 日韩国产在线 | 欧美有码在线观看 | 亚洲资源在线观看 | 99热久久国产综合精品久久国产 | 国产成人亚洲精品老王 | 欧美激情国产一区在线不卡 | 亚洲国产资源 | 国产一区二区在线视频播放 | 欧美三区在线 | 爽死你个放荡粗暴小淫货双女视频 | 午夜性a一级毛片 | 久久一级毛片 | 免费观看呢日本天堂视频 | 国产三级手机在线 | 9久9久热精品视频在线观看 | 亚洲理论欧美理论在线观看 | 欧美日韩第三页 | 国产成人免费在线观看 | 一本色道久久99一综合 | 日本天堂网在线 | 国产精品三区四区 | 亚洲在线中文字幕 | 色三级大全高清视频在线观看 | 在线观看偷拍视频一区 | 国产一级精品视频 | 成年女人在线视频 | 色在线网站免费观看 | 亚洲人在线 | 奇米第四狠狠777高清秒播 | 男人女人做黄刺激性视频免费 | 一本色道久久88综合亚洲精品高清 | 亚洲精品一区二区三区五区 |