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

golang panic及處理機制

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

一 panic機制

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

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

二 實例   

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"))
}

此時我們在func中用recover,那么掛掉的只是func,他不會拋到main中,所以main能繼續(xù)運行,繼而main開辟的go test1也能繼續(xù)運行

2.3 func用recover且開創(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雖然掛掉了,但是他開創(chuàng)的go沒掛掉,因為即使是這個函數(shù)退出了,新開的協(xié)程是相當(dāng)于基于main下的一個子程,只要main不退出,他依然會“存活”

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é)程中如果沒recover,那么error就會拋向main,main就會掛掉,從而沒有執(zhí)行到后面的log打印。

---> 這種情況,main中做defer recover是沒用的

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拋出進而本身退出,func1得到異常,執(zhí)行終止,本身退出時recover進行處理,從而?;盍薽ain

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

相關(guān)文章

  • Go?常見設(shè)計模式之單例模式詳解

    Go?常見設(shè)計模式之單例模式詳解

    單例模式是設(shè)計模式中最簡單的一種模式,單例模式能夠確保無論對象被實例化多少次,全局都只有一個實例存在,在Go?語言有多種方式可以實現(xiàn)單例模式,所以我們今天就來一起學(xué)習(xí)下吧
    2023-07-07
  • Golang中關(guān)于defer的盲區(qū)梳理

    Golang中關(guān)于defer的盲區(qū)梳理

    關(guān)于Go中的defer,是做什么的?執(zhí)行順序是怎么樣的?相信學(xué)過Go語言的同學(xué),已經(jīng)不在陌生,今天就來講講其中需要掌握的幾個知識點,希望對大家有所幫助
    2023-03-03
  • Go語言中database/sql的用法介紹

    Go語言中database/sql的用法介紹

    Go語言中的database/sql包定義了對數(shù)據(jù)庫的一系列操作,database/sql/driver包定義了應(yīng)被數(shù)據(jù)庫驅(qū)動實現(xiàn)的接口,這些接口會被sql包使用,本文將詳細給大家介紹Go的database/sql的使用方法,需要的朋友可以參考下
    2023-05-05
  • 深入理解 Go 語言中的 Context

    深入理解 Go 語言中的 Context

    這篇文章主要介紹了 理解 Go 語言中的 Context,需要的朋友可以參考下
    2020-06-06
  • Golang?使用os?庫的?ReadFile()?讀文件最佳實踐

    Golang?使用os?庫的?ReadFile()?讀文件最佳實踐

    這篇文章主要介紹了Golang使用os庫的ReadFile()讀文件最佳實踐,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 最新評論