欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年03月19日 11:22:07   作者:機(jī)器馬喝啤酒  
這篇文章主要為大家介紹了golang?recover函數(shù)使用中的一些坑解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

眾所周知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ù)不可用。

正確寫(xiě)法

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值

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

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

相關(guān)文章

  • Golang教程之不可重入函數(shù)的實(shí)現(xiàn)方法

    Golang教程之不可重入函數(shù)的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Golang教程之不可重入函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Golang使用Gin框架實(shí)現(xiàn)HTTP上傳文件過(guò)程介紹

    Golang使用Gin框架實(shí)現(xiàn)HTTP上傳文件過(guò)程介紹

    由于需求中有文件上傳這一個(gè)需求,在這里我們就學(xué)習(xí)一下go語(yǔ)言如何上傳文件。本文主要通過(guò)表單的方式進(jìn)行文件上傳操作,本文實(shí)例為大家分享了Go實(shí)現(xiàn)文件上傳操作的具體代碼,供大家參考,具體內(nèi)容如下
    2023-04-04
  • 基于Go語(yǔ)言實(shí)現(xiàn)一個(gè)并發(fā)下載器

    基于Go語(yǔ)言實(shí)現(xiàn)一個(gè)并發(fā)下載器

    這篇文章主要為大家詳細(xì)介紹了如何利用GO語(yǔ)言實(shí)現(xiàn)一個(gè)并發(fā)的文件下載器,可以在不重新啟動(dòng)整個(gè)下載的情況下處理錯(cuò)誤,感興趣的小伙伴可以了解一下
    2023-10-10
  • 一文帶你深入了解Go語(yǔ)言中的事務(wù)

    一文帶你深入了解Go語(yǔ)言中的事務(wù)

    事務(wù)中止時(shí),你結(jié)束事務(wù)了嗎?在開(kāi)發(fā)時(shí)有可能就會(huì)犯這樣的錯(cuò)誤,其問(wèn)題就是你在提交事務(wù)時(shí),如果中間有其他業(yè)務(wù)就取消操作,那么事務(wù)也關(guān)閉了嗎?本文就來(lái)詳細(xì)講講
    2023-04-04
  • golang 實(shí)現(xiàn)Location跳轉(zhuǎn)方式

    golang 實(shí)現(xiàn)Location跳轉(zhuǎn)方式

    這篇文章主要介紹了golang 實(shí)現(xiàn)Location跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 淺析Go語(yǔ)言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的

    淺析Go語(yǔ)言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的

    在?Go?中,map?是一種用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),它提供了一種快速查找和訪問(wèn)數(shù)據(jù)的方式,下面我們就來(lái)看看Go語(yǔ)言中是如何實(shí)現(xiàn)map數(shù)據(jù)結(jié)構(gòu)的吧
    2024-03-03
  • Goland 斷點(diǎn)調(diào)試Debug的操作

    Goland 斷點(diǎn)調(diào)試Debug的操作

    這篇文章主要介紹了Goland 斷點(diǎn)調(diào)試Debug的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • go語(yǔ)言中的map如何解決散列性能下降

    go語(yǔ)言中的map如何解決散列性能下降

    近期對(duì)go語(yǔ)言的map進(jìn)行深入了解和探究,其中關(guān)于map解決大量沖突的擴(kuò)容操作設(shè)計(jì)的十分巧妙,所以筆者特地整理了這篇文章來(lái)探討一下go語(yǔ)言中map如何解決散列性能下降,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • GO語(yǔ)言ini配置文件的讀取的操作

    GO語(yǔ)言ini配置文件的讀取的操作

    這篇文章主要介紹了GO語(yǔ)言ini配置文件的讀取的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 使用golang實(shí)現(xiàn)一個(gè)MapReduce的示例代碼

    使用golang實(shí)現(xiàn)一個(gè)MapReduce的示例代碼

    這篇文章主要給大家介紹了關(guān)于如何使用golang實(shí)現(xiàn)一個(gè)MapReduce,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09

最新評(píng)論