婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > golang panic及處理機(jī)制

golang panic及處理機(jī)制

熱門(mén)標(biāo)簽:開(kāi)通400電話申請(qǐng)流程 智能語(yǔ)音電銷(xiāo)的機(jī)器人 百度地圖標(biāo)注位置網(wǎng)站 武漢百應(yīng)人工智能電銷(xiāo)機(jī)器人 如何利用高德地圖標(biāo)注家 揚(yáng)州電銷(xiāo)外呼系統(tǒng)軟件 400手機(jī)電話免費(fèi)辦理 電腦外呼系統(tǒng)輻射大嗎 上海企業(yè)外呼系統(tǒng)排名

一 panic機(jī)制

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

 golang雖然沒(méi)有try catch機(jī)制,卻有一種類(lèi)似的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)行處理,從而保活了main

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

您可能感興趣的文章:
  • Golang捕獲panic堆棧信息的講解
  • Golang中異常處理機(jī)制詳解
  • GoLang 逃逸分析的機(jī)制詳解
  • 深入理解golang的異常處理機(jī)制

標(biāo)簽:黑龍江 宜賓 張掖 江西 新余 延邊 嘉峪關(guān) 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang panic及處理機(jī)制》,本文關(guān)鍵詞  golang,panic,及,處理,機(jī)制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang panic及處理機(jī)制》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于golang panic及處理機(jī)制的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 壶关县| 中宁县| 郎溪县| 临邑县| 阿拉善右旗| 大厂| 军事| 侯马市| 边坝县| 东至县| 香河县| 城口县| 金沙县| 新巴尔虎右旗| 隆子县| 江西省| 黄大仙区| 房山区| 泗洪县| 高陵县| 仁化县| 云安县| 昂仁县| 岳阳县| 枣强县| 黄大仙区| 无棣县| 太谷县| 察隅县| 宁安市| 肃南| 虞城县| 叶城县| 深水埗区| 荆门市| 青神县| 阳高县| 大安市| 双鸭山市| 大名县| 兴业县|