在Go中,錯誤是一個內建的 interface 類型,其定義如下:
type error interface {
Error() string
}
這個 interface 只有一個方法,即Error()
方法,該方法返回一個 string,表示錯誤的訊息。任何 struct
實作了這個介面,就表示它是一個 Error。
可以使用內建的errors
套件來建立簡單的錯誤,例如:
import "errors"
err := errors.New("這是一個錯誤")
也可以用 fmt
建立錯誤
import "fmt"
err := fmt.Errorf("自訂錯誤")
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("除數不能為零")
}
return a / b, nil
}
這可以通過if
語句或if err != nil
來實現。
result, err := divide(10, 0)
if err != nil {
fmt.Println("發生錯誤:", err)
} else {
fmt.Println("結果:", result)
}
可以通過創建實現error
接口的自定義類型來提供更多的錯誤信息和上下文信息。
type MyError struct {
message string
}
func (e *MyError) Error() string {
return e.message
}
func doSomething() error {
return &MyError{"這是一個自定義錯誤"}
}
在處理錯誤時,可以使用fmt.Errorf
來建立錯誤鏈,將多個錯誤信息組合在一起以提供更多上下文信息。
func readConfig() error {
// ...
if err := validateConfig(); err != nil {
return fmt.Errorf("配置無效: %w", err)
}
// ...
return nil
}
Go推崇錯誤處理的最佳實踐是在每個可能返回錯誤的函數調用後都要檢查錯誤,並在調用者處處理錯誤,而不是在深層堆疊中拋出異常。