天天看點

Golang學習(2)——errors 包

Golang學習 - errors 包

--------------------

Go 語言使用 error 類型來傳回函數執行過程中遇到的錯誤,如果傳回的 error 值為 nil,則表示未遇到錯誤,否則 error 會傳回一個字元串,用于說明遇到了什麼錯誤。其實 error 隻是一個接口,定義如下:

type error interface {

    Error() string

}

你可以用任何類型去實作它(隻要添加一個 Error() 方法即可),也就是說,error 可以是任何類型,這意味着,函數 Error 傳回的 string 值實際可以包含任意資訊,不一定隻是字元串(當然字元串是必須的)。

error 也不一定表示一個錯誤,它可以表示任何資訊,比如 io 包中就用 error 類型的 io.EOF 表示資料讀取結束,而不是遇到了什麼錯誤。再比如 path/filepath 包中用 error 類型的filepath.SkipDir表示跳過目前目錄,繼續周遊下一個目錄,而不是遇到了什麼錯誤。

errors 包實作了一個最簡單的 error 類型,隻包含一個字元串,它可以記錄大多數情況下遇到的錯誤資訊。errors 包的用法也很簡單,隻有一個 New 函數,用于生成一個最簡單的 error 對象: 

// 将字元串 text 包裝成一個 error 對象傳回

func New(text string) error

--------------------

// 示例

func SomeFunc() error {

    if 遇到錯誤 {

        return errors.New("遇到了某某錯誤") 

    }

    return nil

}

如果你的程式需要記錄更多的錯誤資訊,比如時間、數值等資訊,可以聲明一個自定義的 error 類型。

--------------------

// 示例

package main

import (

    "fmt"

    "time"

)

type myError struct { 

    err   string 

    time  time.Time 

    count int

}

func (m *myError) Error() string {

    return fmt.Sprintf("%s %d 次。時間:%v", m.err, m.count, m.time) 

}

func newErr(s string, i int) *myError {

    return &myError{

        err: s,

        time: time.Now(),

        count: i,

    }

}

var count int

func SomeFunc() error {

    if true {

        count++

        return newErr("遇到某某情況", count)

    }

    return nil

}

func main() {

    for i := 0; i < 5; i++ {

        if err := SomeFunc(); err != nil {

            fmt.Println(err)

        }

    }

}

轉載于:https://blog.51cto.com/pkbai/1876391