1. 程式人生 > >GO語言使用之Error處理

GO語言使用之Error處理

一、為什麼需要處理錯誤?

1、從案列引出error處理

package main
import (
    "fmt"
)
func test() {
    num1 := 10
    num2 := 0
    res := num1 / num2
    fmt.Println("res=", res)

}
func main() {
    test()
    fmt.Println("下面的程式碼和邏輯...")
}

案列分析:
程式碼因為執行到 num/0 的因此發生了 panic : runtime error 導致整個程式崩潰. 但是在實際開發中,我們希望:如果出現panic, 給管理員一個預警,但是程式還執行.-> 錯誤處理機制。

2、錯誤處理的好處
進行錯誤處理後,程式不會輕易掛掉,如果加入預警程式碼,就可以讓程式更加的健壯。

二、基本介紹

1、Go語言追求簡潔優雅,所以,Go語言不支援傳統的 try…catch…finally 這種處理。
2、Go中引入的處理方式為:defer, panic, recover
3、這幾個異常的使用場景可以這麼簡單描述:Go中可以丟擲一個panic的異常,然後在defer中通過recover捕獲這個異常,然後處理

三、使用defer 和 recover來處理錯誤

// 使用defer 和 recover來處理錯誤
func ErrorDemo() (errCount int
){ defer func() { if err := recover(); err != nil { //說明err有錯誤 fmt.Println("傳送簡訊,郵件給管理員...", err) errCount++ } }() num1 := 10 num2 := 0 res := num1 / num2 fmt.Println("res=", res) return }

四、自定義錯誤

Go程式中,也支援自定義錯誤, 使用errors.New 和 panic 內建函式。
1、errors.New(“錯誤說明”) , 會返回一個error型別的值,表示一個錯誤
2、panic內建函式 ,接收一個interface{}型別的值(也就是任何值了)作為引數。可以接收error型別的變數,輸出錯誤資訊,並退出程式.

// 自定義錯誤
func ErrorDemo2() {
    // 測試的panic 是否會被捕獲
    defer func() {
        err := recover() // 程式不會崩潰
        fmt.Println("test defer err=", err) 
    }()

    err := readConfig("config2.ini")
    if err != nil {

        //我們以後的程式碼,需要去判斷到底是什麼錯誤型別,然後給予不同的處理機制
        if err == FILE_NOT_EXIST {
            fmt.Println("錯誤為FILE_NOT_EXIST , 處理方式為...", err)
            // 如果你希望發生了 FILE_NOT_EXIST, 你認為這個錯誤是致命,你希望丟擲錯誤,並
            // 退出程式,就使用panic 完成(前提是你沒有 defer + recover 處理)
            panic(err)
        } else if err == FILE_IO_ERROR {
            fmt.Println("錯誤為FILE_IO_ERROR , 處理方式為...", FILE_NOT_EXIST)
        }

        //fmt.Println("readconfig err=", err)
    } else {
        fmt.Println("success")
    }
}


func readConfig(fileName string) (err error) {
    //假設我們要求這個檔名必須 config.ini , 丟擲一個錯誤
    if fileName == "config.ini" {
        return nil // 沒錯
    } else {
        //返回一個自定義的異常
        //return errors.New("file not exist")
        return FILE_NOT_EXIST
    }
}

五、go專案中處理Error