亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang panic及處理機(jī)制

 更新時(shí)間:2021年08月26日 12:07:26   作者:布叔喂丶  
Go語(yǔ)言追求簡(jiǎn)潔優(yōu)雅,所以,Go語(yǔ)言不支持傳統(tǒng)的 try…catch…finally 這種異常,因?yàn)镚o語(yǔ)言的設(shè)計(jì)者們認(rèn)為,將異常與控制結(jié)構(gòu)混在一起會(huì)很容易使得代碼變得混亂,今天給大家介紹golang panic及處理機(jī)制,需要的朋友參考下吧

一 panic機(jī)制

  panic會(huì)將這個(gè)異常不斷向上拋出,直到有地方處理它,如果有處理,則不會(huì)再向上拋出。倘若沒(méi)有處理,那么最終會(huì)導(dǎo)致main掛掉.

 golang雖然沒(méi)有try catch機(jī)制,卻有一種類似的recover機(jī)制,后續(xù)demo我們可以觀測(cè)到它的用法和作用

二 實(shí)例   

2.1 main用recover

func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("err:", err)
        }
    }()
    go test1()
    time.Sleep(time.Second * 3)
    panic(errors.New("stop test1"))
    log.Println("123")
    select {}
}
func test1() {
    for {
        tm := time.NewTicker(time.Second)
        select {
        case <-tm.C:
            log.Println("test1")
        }
    }
}

2.2 func用recover

func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("err:", err)
        }
    }()
    go test1()
    time.Sleep(time.Second * 3)
    makeerr()
    log.Println("123")
    select {}
}
 
func test1() {
    for {
        tm := time.NewTicker(time.Second)
        select {
        case <-tm.C:
            log.Println("test1")
        }
    }
}
func makeerr() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("makeerr:", err)
        }
    }()
    panic(errors.New("stop"))
}

此時(shí)我們?cè)趂unc中用recover,那么掛掉的只是func,他不會(huì)拋到main中,所以main能繼續(xù)運(yùn)行,繼而main開(kāi)辟的go test1也能繼續(xù)運(yùn)行

2.3 func用recover且開(kāi)創(chuàng)goroutine

func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("err:", err)
        }
    }()
 
    time.Sleep(time.Second * 3)
    makeerr()
    log.Println("123")
    select {}
}
 
func test1() {
    for {
        tm := time.NewTicker(time.Second)
        select {
        case <-tm.C:
            log.Println("test1")
        }
    }
}
func makeerr() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("makeerr err:", err)
        }
    }()
    go test1()
    panic(errors.New("stop test"))
}

我們發(fā)現(xiàn),func雖然掛掉了,但是他開(kāi)創(chuàng)的go沒(méi)掛掉,因?yàn)榧词故沁@個(gè)函數(shù)退出了,新開(kāi)的協(xié)程是相當(dāng)于基于main下的一個(gè)子程,只要main不退出,他依然會(huì)“存活”

2.4 goroutine中panic

func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("err:", err)
        }
    }()
    go test1()
    time.Sleep(time.Second * 3)
    log.Println("123")
    select {}
}
func test1() {
    log.Println("test1 start")
    panic(errors.New("stop test1"))
    log.Println("test1 end")
}

協(xié)程中如果沒(méi)recover,那么error就會(huì)拋向main,main就會(huì)掛掉,從而沒(méi)有執(zhí)行到后面的log打印。

---> 這種情況,main中做defer recover是沒(méi)用的

2.5 func1內(nèi)嵌func2中panic且func2做處理

func main() {
    test1()
    time.Sleep(time.Second * 3)
    log.Println("123")
}
func test1() {
    log.Println("test1 start")
    test2()
    log.Println("test1 end")
}
func test2() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("test2 err:", err)
        }
    }()
    log.Println("test2 start")
    panic(errors.New("stop test2"))
    log.Println("test2 end")
}

2.6 func1內(nèi)嵌func中panic且func1做處理

func main() {
    test1()
    time.Sleep(time.Second * 3)
    log.Println("123")
}
func test1() {
    defer func() {
        if err := recover(); err != nil {
            log.Println("test? err:", err)
        }
    }()
    log.Println("test1 start")
    test2()
    log.Println("test1 end")
}
func test2() {
    log.Println("test2 start")
    panic(errors.New("stop test2"))
    log.Println("test2 end")
}

func2異常,執(zhí)行終止,向調(diào)用者func1拋出進(jìn)而本身退出,func1得到異常,執(zhí)行終止,本身退出時(shí)recover進(jìn)行處理,從而?;盍薽ain

到此這篇關(guān)于golang panic及處理機(jī)制的文章就介紹到這了,更多相關(guān)golang panic內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO語(yǔ)言中ni,零值與空結(jié)構(gòu)體的使用

    GO語(yǔ)言中ni,零值與空結(jié)構(gòu)體的使用

    Go語(yǔ)言為Java開(kāi)發(fā)者帶來(lái)了一些新概念,如零值、nil和空結(jié)構(gòu)體,理解這些概念有助于Go語(yǔ)言的學(xué)習(xí)和應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 使用IDEA配置GO語(yǔ)言的開(kāi)發(fā)環(huán)境備忘錄

    使用IDEA配置GO語(yǔ)言的開(kāi)發(fā)環(huán)境備忘錄

    最近在配置idea開(kāi)發(fā)go語(yǔ)言時(shí)碰到很多問(wèn)題,想著很多人都可能會(huì)遇到,所以下面這篇文章主要給大家介紹了關(guān)于使用IDEA配置GO語(yǔ)言的開(kāi)發(fā)環(huán)境,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • golang 實(shí)現(xiàn)比特幣內(nèi)核之處理橢圓曲線中的天文數(shù)字

    golang 實(shí)現(xiàn)比特幣內(nèi)核之處理橢圓曲線中的天文數(shù)字

    比特幣密碼學(xué)中涉及到的大數(shù)運(yùn)算超出常規(guī)整數(shù)范圍,需使用golang的big包進(jìn)行處理,通過(guò)使用big.Int類型,能有效避免整數(shù)溢出,并保持邏輯正確性,測(cè)試展示了在不同質(zhì)數(shù)模下的運(yùn)算結(jié)果,驗(yàn)證了邏輯的準(zhǔn)確性,此外,探討了費(fèi)馬小定理在有限字段除法運(yùn)算中的應(yīng)用
    2024-11-11
  • 如何在Go中使用Casbin進(jìn)行訪問(wèn)控制

    如何在Go中使用Casbin進(jìn)行訪問(wèn)控制

    這篇文章主要介紹了如何在Go中使用Casbin進(jìn)行訪問(wèn)控制,Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪問(wèn)控制模型,Casbin只負(fù)責(zé)訪問(wèn)控制
    2022-08-08
  • Golang的關(guān)鍵字defer的使用方法

    Golang的關(guān)鍵字defer的使用方法

    這篇文章主要介紹了Golang的關(guān)鍵字defer的使用方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Golang爬蟲(chóng)框架 colly的使用

    Golang爬蟲(chóng)框架 colly的使用

    本文主要介紹了Golang爬蟲(chóng)框架 colly的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Go語(yǔ)言單元測(cè)試基礎(chǔ)從入門(mén)到放棄

    Go語(yǔ)言單元測(cè)試基礎(chǔ)從入門(mén)到放棄

    這篇文章主要介紹了Go單元測(cè)試基礎(chǔ)從入門(mén)到放棄為大家開(kāi)啟Go語(yǔ)言單元測(cè)試第一篇章,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言中interface語(yǔ)法與使用詳解

    Go語(yǔ)言中interface語(yǔ)法與使用詳解

    Go語(yǔ)言里面設(shè)計(jì)最精妙的應(yīng)該算interface,它讓面向?qū)ο?內(nèi)容組織實(shí)現(xiàn)非常的方便,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中interface語(yǔ)法與使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • go 迭代string數(shù)組操作 go for string[]

    go 迭代string數(shù)組操作 go for string[]

    這篇文章主要介紹了go 迭代string數(shù)組操作 go for string[],具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言實(shí)現(xiàn)管理多個(gè)數(shù)據(jù)庫(kù)連接

    Go語(yǔ)言實(shí)現(xiàn)管理多個(gè)數(shù)據(jù)庫(kù)連接

    在軟件開(kāi)發(fā)過(guò)程中,使用?MySQL、PostgreSQL?或其他數(shù)據(jù)庫(kù)是很常見(jiàn)的,由于配置和要求不同,管理這些連接可能具有挑戰(zhàn)性,下面就來(lái)和大家聊聊如何在Go中管理多個(gè)數(shù)據(jù)庫(kù)連接吧
    2023-10-10

最新評(píng)論