1. 程式人生 > >Golang學習 - errors 包

Golang學習 - errors 包

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

  Go 語言使用 error 型別來返回函式執行過程中遇到的錯誤,如果返回的 error 值為 nil,則表示未遇到錯誤,否則 error 會返回一個字串,用於說明遇到了什麼錯誤。

其實 error 只是一個介面,定義如下:

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

type error interface {
	Error() string
}

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

  你可以用任何型別去實現它(只要新增一個 Error
() 方法即可),也就是說,error 可以是任何型別,這意味著,函式返回的 error 值實際可以包含任意資訊,不一定是字串(當然字串是必須的)。   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) } } } ------------------------------------------------------------
   
------------------------------------------------------------

  Go 語言使用 error 型別來返回函式執行過程中遇到的錯誤,如果返回的 error 值為 nil,則表示未遇到錯誤,否則 error 會返回一個字串,用於說明遇到了什麼錯誤。

其實 error 只是一個介面,定義如下:

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

type error interface {
	Error() string
}

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

  你可以用任何型別去實現它(只要新增一個 Error() 方法即可),也就是說,error 可以是任何型別,這意味著,函式返回的 error 值實際可以包含任意資訊,不一定是字串(當然字串是必須的)。

  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)
		}
	}
}

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