這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
發現Golang很多開源的package都是使用Error來定義錯誤異常,其實我自己更加的習慣利用返回的值進行判斷。 雖然這麼說,但Golang的error定義還是有意思的,合理就返回nil,不合理就返回Error的草錯誤。
該文章寫的有些亂,歡迎來噴 ! 另外文章後續不斷更新中,請到原文地址查看更新.
http://xiaorui.cc/?p=2963
下面說說Golang的自訂錯誤的用法。在go裡定義錯誤異常的方式有這麼兩種,但都需要你的傳回值是error類型的。
Pythonfunc Control() error { //xxxx}
1234 |
func Control() error { //xxxx} |
第一種方式是使用golang標準庫包errors 來定義錯誤。使用方法很是簡單,只需要 return errors.New(“string”) 。 這樣就是一個最簡單的錯誤返回。
第二種方式是借用struct結構體,建立一個struct的Error()方法,注意這個方法名是Error,不然會出現下面的Bug, 找不到Error方法。
Python./er.go:25: cannot use equalError literal (type equalError) as type error in return argument: equalError does not implement error (missing Error method)
123 |
./er.go:25: cannot use equalError literal (type equalError) as type error in return argument: equalError does not implement error (missing Error method) |
下面是一個比較完整的Error的使用方法。不僅有errors,還有struct Error()方式.
Python#http://xiaorui.ccpackage mainimport ("errors""fmt")type equalError struct {Num int}//方法名字是Error()func (e equalError) Error() string {return fmt.Sprintf("你現在是數字是 %d ,還是超了55", e.Num)}func Equal(n int) (int, error) {if n > 55 {return -1, errors.New("超過了55") //產生一個簡單的 error 類型}return n, nil}func DiyEqual(n int) (int, error) {if n > 55 {return -1, equalError{Num: n} // 會調用equalError的Error方法}return n, nil}func main() {//使用errors.New產生error對象if result, err := Equal(100); err != nil {fmt.Println("錯誤:", err)} else {fmt.Println("結果:", result)}//不適用erros,自訂錯誤方式.if result, err := DiyEqual(100); err != nil {fmt.Println("錯誤:", err)} else {fmt.Println("結果:", result)}}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
#http://xiaorui.ccpackage main import ("errors""fmt") type equalError struct {Num int} //方法名字是Error()func (e equalError) Error() string {return fmt.Sprintf("你現在是數字是 %d ,還是超了55", e.Num)} func Equal(n int) (int, error) {if n > 55 {return -1, errors.New("超過了55") //產生一個簡單的 error 類型}return n, nil} func DiyEqual(n int) (int, error) {if n > 55 {return -1, equalError{Num: n} // 會調用equalError的Error方法}return n, nil} func main() {//使用errors.New產生error對象if result, err := Equal(100); err != nil {fmt.Println("錯誤:", err)} else {fmt.Println("結果:", result)} //不適用erros,自訂錯誤方式.if result, err := DiyEqual(100); err != nil {fmt.Println("錯誤:", err)} else {fmt.Println("結果:", result)} } |
上面這段golang errors代碼執行後的結果是:
Python[ `go run er.go` | done: 659.182168ms ] 錯誤: 超過了55 錯誤: 你現在是數字是 100 ,還是超了55
1234 |
[ `go run er.go` | done: 659.182168ms ] 錯誤: 超過了55 錯誤: 你現在是數字是 100 ,還是超了55 |