Go語言的標準庫中的errors
包提供了一些用于創建和操作錯誤的基本功能。下面是對該包的詳細用法說明。
基本用法
-
創建錯誤
使用
errors.New
函數創建一個新的錯誤對象。errors.New
接受一個字符串參數作為錯誤信息,并返回一個實現了error
接口的對象。package mainimport ("errors""fmt" )func main() {err := errors.New("這是一個錯誤")fmt.Println(err) // 輸出: 這是一個錯誤 }
-
使用
fmt.Errorf
格式化錯誤fmt
包也提供了一個創建錯誤的方法——fmt.Errorf
,它可以接收格式化字符串,并返回一個實現了error
接口的對象。package mainimport ("fmt" )func main() {num := 42err := fmt.Errorf("發生錯誤,數字是 %d", num)fmt.Println(err) // 輸出: 發生錯誤,數字是 42 }
自定義錯誤類型
除了直接使用errors.New
創建的簡單錯誤對象外,通常我們會定義自己的錯誤類型,以便在程序中更好地處理錯誤。自定義錯誤類型需要實現error
接口,即定義一個返回字符串的Error()
方法。
package mainimport ("fmt"
)// MyError 結構體定義了一個自定義錯誤類型
type MyError struct {Msg stringCode int
}// Error 方法讓 MyError 實現了 error 接口
func (e *MyError) Error() string {return fmt.Sprintf("錯誤代碼 %d: %s", e.Code, e.Msg)
}func main() {err := &MyError{Msg: "自定義錯誤消息",Code: 500,}fmt.Println(err) // 輸出: 錯誤代碼 500: 自定義錯誤消息
}
錯誤鏈
從Go 1.13開始,標準庫引入了錯誤鏈的概念,允許將多個錯誤鏈接在一起形成一個鏈表結構。通過fmt.Errorf
函數和%w
動詞來包裝另一個錯誤,從而形成新的錯誤鏈。
package mainimport ("errors""fmt"
)func firstLevelError() error {return errors.New("第一級錯誤")
}func secondLevelError() error {err := firstLevelError()// 使用 %w 包裝底層錯誤return fmt.Errorf("第二級錯誤: %w", err)
}func thirdLevelError() error {err := secondLevelError()// 繼續包裝上一級錯誤return fmt.Errorf("第三級錯誤: %w", err)
}func main() {err := thirdLevelError()fmt.Println(err) // 輸出: 第三級錯誤: 第二級錯誤: 第一級錯誤// 使用 errors.Unwrap 解包最底層的錯誤unwrappedErr := errors.Unwrap(err)fmt.Println(unwrappedErr) // 輸出: 第二級錯誤: 第一級錯誤// 使用 errors.Is 判斷錯誤是否包含指定的錯誤類型isMatch := errors.Is(err, firstLevelError())fmt.Println(isMatch) // 輸出: true
}
使用errors.As
判斷錯誤類型
如果有一個錯誤鏈,并且你想找到特定類型的錯誤,可以使用errors.As
函數進行類型斷言檢查。
package mainimport ("errors""fmt"
)type CustomError struct {Message string
}func (e *CustomError) Error() string {return e.Message
}func someFunction() error {return &CustomError{Message: "自定義錯誤信息"}
}func main() {err := someFunction()var customErr *CustomErrorif errors.As(err, &customErr) {fmt.Printf("找到了自定義錯誤: %v\n", customErr)} else {fmt.Println("沒有找到自定義錯誤")}
}
以上是關于Go語言errors
標準庫的一些基本用法和高級特性。