一、 錯誤指程序中出現不正常的狀況,從而致使程序沒法正常執行。
•大多語言中使用try... catch... finally語句執行。
假設咱們正在嘗試打開一個文件,文件系統中不存在這個文件。這是一個異常狀況,它表示爲一個錯誤。
二、 Go語言中沒有try...catchgit
go中error的源碼github
package errors // New returns an error that formats as the given text. // Each call to New returns a distinct error value even if the text is identical. func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string } func (e *errorString) Error() string { return e.s }
package main import ( "math" "fmt" "os" "github.com/pkg/errors" ) func main() { // 異常狀況1 res := math.Sqrt(-100) fmt.Println(res) res , err := Sqrt(-100) if err != nil { fmt.Println(err) } else { fmt.Println(res) } //異常狀況2 //res = 100 / 0 //fmt.Println(res) res , err = Divide(100 , 0) if err != nil { fmt.Println(err.Error()) } else { fmt.Println(res) } //異常狀況3 f, err := os.Open("/abc.txt") if err != nil { fmt.Println(err) } else { fmt.Println(f.Name() , "該文件成功被打開!") } } //定義平方根運算函數 func Sqrt(f float64)(float64 , error) { if f<0 { return 0 , errors.New("負數不能夠獲取平方根") } else { return math.Sqrt(f) , nil } } //定義除法運算函數 func Divide(dividee float64 , divider float64)(float64 , error) { if divider == 0 { return 0 , errors.New("出錯:除數不能夠爲0!") } else { return dividee / divider , nil } }
go中error的建立方式ide
//error建立方式一 func Sqrt(f float64)(float64 , error) { if f<0 { return 0 , errors.New("負數不能夠獲取平方根") } else { return math.Sqrt(f) , nil } } //error建立方式二;設計一個函數:驗證年齡。若是是負數,則返回error func checkAge(age int) (string, error) { if age < 0 { err := fmt.Errorf("您的年齡輸入是:%d , 該數值爲負數,有錯誤!", age) return "", err } else { return fmt.Sprintf("您的年齡輸入是:%d ", age), nil } }
• 一、定義一個結構體,表示自定義錯誤的類型
• 二、讓自定義錯誤類型實現error接口的方法:Error() string
• 三、定義一個返回error的函數。根據程序實際功能而定。函數
package main import ( "time" "fmt" ) //一、定義結構體,表示自定義錯誤的類型 type MyError struct { When time.Time What string } //二、實現Error()方法 func (e MyError) Error() string { return fmt.Sprintf("%v : %v", e.When, e.What) } //三、定義函數,返回error對象。該函數求矩形面積 func getArea(width, length float64) (float64, error) { errorInfo := "" if width < 0 && length < 0 { errorInfo = fmt.Sprintf("長度:%v, 寬度:%v , 均爲負數", length, width) } else if length < 0 { errorInfo = fmt.Sprintf("長度:%v, 出現負數 ", length) } else if width < 0 { errorInfo = fmt.Sprintf("寬度:%v , 出現負數", width) } if errorInfo != "" { return 0, MyError{time.Now(), errorInfo} } else { return width * length, nil } } func main() { res , err := getArea(-4, -5) if err != nil { fmt.Printf(err.Error()) } else { fmt.Println("面積爲:" , res) } }