溫馨提示×

溫馨提示×

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

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

GO語言中err接口及defer延遲異常怎么處理

發(fā)布時間:2022-04-15 10:30:27 來源:億速云 閱讀:174 作者:iii 欄目:開發(fā)技術

這篇“GO語言中err接口及defer延遲異常怎么處理”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“GO語言中err接口及defer延遲異常怎么處理”文章吧。

    err接口

    Go語言引入了一個關于錯誤處理的標準模式,即error接口,它是Go語言內(nèi)建的接口類型,該接口的定義如下:

    type error interface {
        Error() string
    }

    調(diào)用對應接口

    	err:=errors.New("this is normal err")
    	fmt.Println(err.Error())
    	err2:=fmt.Errorf("this is normal err")
    	fmt.Println(err2)

    案例:除數(shù)b為0時

    package main
    import (
    	"errors"
    	"fmt"
    )
    func main() {
    	//接收錯誤信息和正確信息
    	result,err := test(5,0)
    	//加了判斷,如果沒有錯誤err=nil
    	if err!=nil{
    		fmt.Println(err)
    	}else {
    		fmt.Println(result)
    	}
    }
    //b為0時拋出異常
    func test(a,b int) (result int, err error) {  //返回錯誤信息
    	err = nil
    	if b==0{
    		err =errors.New("b不能為0")
    	}else {
    		result = a/b
    	}
    	return
    }

    panic函數(shù)

    error返回的是一般性的錯誤,但是panic函數(shù)返回的是讓程序崩潰的錯誤。

    一般而言,當panic異常發(fā)生時,程序會中斷運行。

    所以,我們在實際的開發(fā)過程中并不會直接調(diào)用panic( )函數(shù),但是當我們編程的程序遇到致命錯誤時,系統(tǒng)會自動調(diào)用該函數(shù)來終止整個程序的運行,也就是系統(tǒng)內(nèi)置了panic函數(shù)。

    案例

    package main
    import "fmt"
    func main() {
    	test1()
    	test2()
    	test3()
    
    }
    func test1()  {
    	fmt.Println("test1")
    }
    func test2()  {
    	panic("panic test2")  //程序中斷
    }
    func test3()  {
    	fmt.Println("test3")
    }

    結果:

    test1
    panic: panic test2
    goroutine 1 [running]:
    main.test2(...)

    defer延遲

    總結

    關鍵字 defer?于延遲一個函數(shù)的執(zhí)行,調(diào)用了,但是沒有執(zhí)行,也會完成參數(shù)的傳遞

    defer fmt.Println("333")
    defer fmt.Println("222")
    defer fmt.Println("111")
    
    依次輸出順序:111,222,333

    如果一個函數(shù)中有多個defer語句,它們會以后進先出的順序執(zhí)行。
    注意,defer語句只能出現(xiàn)在函數(shù)的內(nèi)部。

    defer與匿名函數(shù)結合使用

    案例1:無參數(shù)

    package main
    import "fmt"
    func main() {
    	a := 10
    	b := 20
    	defer func() {
    		fmt.Println("匿名函數(shù)a", a)
    		fmt.Println("匿名函數(shù)b", b)
    	}()
    	a = 100
    	b = 200
    	fmt.Println("main函數(shù)a", a)
    	fmt.Println("main函數(shù)b", b)
    }

    結果:

    main函數(shù)a 100
    main函數(shù)b 200
    匿名函數(shù)a 100
    匿名函數(shù)b 200

    案例二:有參數(shù)

    package main
    import "fmt"
    func main() {
    	a := 10
    	b := 20
      //調(diào)用了,也傳參數(shù)了,但是沒有執(zhí)行
    	defer func(a,b int) { //添加參數(shù)
    		fmt.Println("匿名函數(shù)a", a)
    		fmt.Println("匿名函數(shù)b", b)
    	}(a,b)  //傳參數(shù)
    	a = 100
    	b = 200
    	fmt.Println("main函數(shù)a", a)
    	fmt.Println("main函數(shù)b", b)
    }

    結果:

    main函數(shù)a 100
    main函數(shù)b 200
    匿名函數(shù)a 10
    匿名函數(shù)b 20

    recover防止程序中斷

    運行時panic異常一旦被引發(fā)就會導致程序崩潰。這當然不是我們愿意看到的,因為誰也不能保證程序不會發(fā)生任何運行時錯誤。

    Go語言為我們提供了專用于“攔截”運行時panic的內(nèi)建函數(shù)——recover。它可以是當前的程序從運行時panic的狀態(tài)中恢復并重新獲得流程控制權。

    注意:recover只有在defer調(diào)用的函數(shù)中有效。

    func testA()  {
        fmt.Println("testA")
    }
    func testB(x int)  {
        //設置recover()
        //在defer調(diào)用的函數(shù)中使用recover()
        defer func() {
            //防止程序崩潰
            //recover()
            //fmt.Println(recover())
    				//加了一層判斷
            if err:=recover();err!=nil {
                fmt.Println(err)
            }
        }()  //匿名函數(shù)
        var a [3]int
        a[x] = 999
    }
    func testC()  {
        fmt.Println("testC")
    }
    func main() {
        testA()
        testB(0)  //發(fā)生異常 中斷程序
        testC()
    }

    以上就是關于“GO語言中err接口及defer延遲異常怎么處理”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

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

    AI