首頁 > 軟體

Golang 錯誤捕獲Panic與Recover的使用

2022-03-22 13:00:41

一、Golang 錯誤是什麼?

對於Go語言(Golang)的錯誤是通過返回值的方式,來強迫呼叫者對錯誤進行處理,要麼你通過 _ 忽略,要麼你處理。對於這種設計方式,我們通常需要會寫大量的 if err != nil 判斷。我們可以通過方法來做到校驗。

這類程式碼非常的多,儘管工程中 error 大部分都是nil,也就是沒有任何錯誤,但是非nil的時候,就意味著錯誤就出現了。
在Go語言中,使用多值返回來返回錯誤。Go中可以丟擲一個 panic 的異常,然後在 defe r中通過 recover 捕獲這個異常,然後再正常處理。

二、錯誤校驗

1.方法

當存在錯誤時,我們通過方法來判斷是否 panic:

func Panic(err error) {

    if err != nil {
        panic(err)
    }
}

2.判斷錯誤

程式碼如下(範例):

若不採用方法

for _, c := range []string{"1", "2"} {

        atoi, err := strconv.Atoi(c)
        if err != nil {
            return
        }
        fmt.Println(atoi)
    }

若採用方法

但此時 panic 還需要我們額外處理來將錯誤捕獲

    for _, c := range []string{"1", "2"} {

        atoi, err := strconv.Atoi(c)
        Panic(err)
        fmt.Println(atoi)
    }

三、錯誤捕獲

1.方法

當存在錯誤時,我們通過recover來判斷 panic 是否產生:

func RecoverError() {

    if err := recover(); err != nil {
        //輸出panic資訊
        fmt.Println(err)

        //輸出堆疊資訊
        fmt.Println(string(debug.Stack()))
    }
}

2.defer 的使用

由於我們的捕獲必須在錯誤產生之後,那我們就必須保證捕獲方法呼叫在錯誤處理方法之後,也就是通過 defer 來控制方法的最後呼叫 :

func main() {
    // 當使用defer 時,將會在程式內方法結算後,
    // 依照後進先出的方法執行defer內方法
    // 此時就能保證 捕獲程式一定能捕獲到錯誤
    defer RecoverError()
    for _, c := range []string{"1", "2"} {

        atoi, err := strconv.Atoi(c)
        Panic(err)

        fmt.Println(atoi)
    }

}

總結

通過以上來簡單熟悉Golang 與其他語言截然不同的錯誤處理形式,由於其他語言開發者經常將異常與控制結構混在一起,這會很容易使得程式碼變得混亂。開發者也很容易濫用異常,甚至一個小小的錯誤都丟擲一個異常。這在Golang中不被允許,Go語言也就不支援傳統的 try…catch…finally 這種異常,通過新的 defer panic recover 來進行錯誤處理。

到此這篇關於Golang 錯誤捕獲Panic與Recover的使用的文章就介紹到這了,更多相關Golang 錯誤捕獲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com