中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang異常控制處理程序錯誤流程是什么

發布時間:2023-05-06 15:34:35 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要介紹“Golang異常控制處理程序錯誤流程是什么”,在日常操作中,相信很多人在Golang異常控制處理程序錯誤流程是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Golang異常控制處理程序錯誤流程是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    panic和recover使用

    Go語言不支持傳統的 try…catch…finally 這種異常,因為Go語言的設計者們認為,將異常與控制結構混在一起會很容易使得代碼變得混亂。在Go語言中,設計者們推薦使用多值返回來返回錯誤。遇到真正的異常的情況下(比如除數為 0了)。才使用Go中引入的Exception處理:defer, panic, recover。

    這幾個異常的使用場景可以這么簡單描述:Go中可以拋出一個panic的異常,然后在defer中通過recover捕獲這個異常,然后正常處理

    使用示例

    package main
    import "fmt"
    func main(){
        fmt.Println("c")
         defer func(){ // 必須要先聲明defer,否則不能捕獲到panic異常
            fmt.Println("d")
            if err:=recover();err!=nil{
                fmt.Println(err) // 這里的err其實就是panic傳入的內容,55
            }
            fmt.Println("e")
        }()
        f() //開始調用f
        fmt.Println("f") //這里開始下面代碼不會再執行
    }
    func f(){
        fmt.Println("a")
        panic("異常信息")
        fmt.Println("b") //這里開始下面代碼不會再執行
        fmt.Println("f")
    }

    輸出結果:

    c
    a
    d
    異常信息
    e

    注意

    • 利用recover處理panic指令,recover需要定義在defer匿名函數內

    • defer需要在panic之前聲明,否則當panic時,recover無法捕獲到panic

    • panic無recover情況下,程序會直接崩潰

    子函數panic主函數recover

    func TestPanic(t *testing.T) {
    	defer func() {
    		if err := recover(); err != nil {
    			println("recovered")
    		}
    	}()
    	subFun()
    	subFun()
    }
    func subFun() {
    	println("subFun")
    	panic("subFun panic")
    }

    輸出結果如下,第一個sunFun后面的代碼不會執行

    subFun
    recovered

    子協程panic主函數recover

    func subFun(i int) {
    	fmt.Println("subFun,i=", i)
    	panic("subFun panic")
    }
    func TestSubGoPanic(t *testing.T) {
    	defer func() {
    		if err := recover(); err != nil {
    			println("recovered2")
    		}
    	}()
    	go subFun(3)
    	subFun(4)
    	println("finish")
    }

    結果
    subFun,i= 4
    recovered2
    subFun,i= 3
    --- PASS: TestSubGoPanic (0.00s)
    panic: subFun panic

    goroutine 21 [running]:
    zh.com/base/err.subFun(0x0?)
        /Users/albert/file/code/go/zh/gotest/base/err/panic_test.go:34 +0x89
    created by zh.com/base/err.TestSubGoPanic
        /Users/albert/file/code/go/zh/gotest/base/err/panic_test.go:43 +0x46

    recover會執行,但是程序崩潰了

    使用總結

    如果 panic 和 recover 發生在同一個協程,那么 recover 是可以捕獲的,如果 panic 和 recover 發生在不同的協程,那么 recover 是不可以捕獲的

    也就是哪個協程有panic,哪個協程里必須要有recover,否則會把整個程序弄崩潰

    使用panic的幾點擔心

    性能

    在使用 Golang 進行開發時,遇到 panic 是非常常見的情況。但是,panic 對于性能的影響是相對較小的,尤其是在實際使用中。

    首先,Golang 在運行時會維護一個 panic 堆,用于存儲棧中的 panic 對象。當程序遇到 panic 時,會將該 panic 對象添加到 panic 堆中。panic 堆的大小是有限的,如果堆中的對象過多,可能會導致 panic 堆溢出,從而影響程序的性能

    性能對比

    func BenchmarkSubFunWithError(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		go subFunWithError(i)
    	}
    }
    func BenchmarkSubFunWithRecover(b *testing.B) {
    	for i := 0; i < b.N; i++ {
    		go subFunWithRecover(i)
    	}
    }
    func subFunWithRecover(i int) {
    	//fmt.Println("subFun,i=", i)
    	defer func() {
    		if error := recover(); error != nil {
    			//println("subFunWithRecover_recovered")
    		}
    	}()
    	time.Sleep(time.Second)
    	panic("subFun panic")
    }
    func subFunWithError(i int) error {
    	//fmt.Println("subFun,i=", i)
    	time.Sleep(time.Second)
    	return errors.New("subFunWithError")
    }
    BenchmarkSubFunWithError-12               673920              1992 ns/op             489 B/op          3 allocs/op
    BenchmarkSubFunWithRecover-12            1000000              1229 ns/op             240 B/op          2 allocs/op

    到此,關于“Golang異常控制處理程序錯誤流程是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    巴彦县| 宁南县| 邢台市| 辽阳县| 富裕县| 大姚县| 梁河县| 县级市| 巫山县| 五寨县| 布尔津县| 剑阁县| 营口市| 隆回县| 柏乡县| 宝丰县| 大理市| 平定县| 泰宁县| 错那县| 涞源县| 邳州市| 公安县| 秦安县| 新竹县| 泊头市| 新营市| 财经| 宽城| 荔浦县| 始兴县| 安泽县| 城市| 大冶市| 赣榆县| 巴彦淖尔市| 绥德县| 乳山市| 务川| 鹤峰县| 永登县|