Go 自定義error錯誤

原文鏈接: http://www.zhoubotong.site/post/17.html
Go的error比較靈活.但是自身對error處理的機制有不太好用,我們可以自定義錯誤輸出: 
只要所有實現了 Error() 方法的對象都可以, 這裏給個比較簡單的demo,後續整理一個error的優化封裝:

package main


import (
    "fmt"
)

type NameEmtpyError struct {
    name string
}
//NameEmtpyError實現了 Error() 方法的對象都可以
func (e *NameEmtpyError) Error() string {
    return "name 不能爲空"
}

func NameCheck(name string) (bool, error) {
    if name == "" {
        return false, &NameEmtpyError{name} // 注意error這裏必須是地址&引用
    }
    return true, nil
}

func main() {
    name := ""
    if check, err := NameCheck(name); err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(check)
    }

} 

在go裏定義錯誤異常的方式有這麼兩種,但都需要你的返回值是error類型的:
    第一種方式是使用golang標準庫包errors 來定義錯誤。使用方法很簡單,只需要 return errors.New(“錯誤信息”)  。 這樣就是一個最簡單的錯誤返回。

    第二種方式是借用struct結構體,創建一個struct的Error()方法,注意這個方法名是Error,不然會出現找不到Error方法。
下面我們看一個比較完整的Error的使用方法。不僅有errors,還有struct Error()方式. 

package main

import (
    "errors"
    "fmt"
)

type equalError struct {
    Num int
}

//方法名字是Error()
func (e equalError) Error() string {
    return fmt.Sprintf("當前數字是 %d ,大於10", e.Num)
}

//使用errors.New簡單生成
func Equal(n int) (int, error) {
    if n > 10 {
        return -1, errors.New("大於10") //生成一個簡單的 error 類型
    }
    return n, nil
}

func DiyEqual(n int) (int, error) {
    if n > 10 {
        return -1, equalError{Num: n} // 會調用equalError的Error方法
    }
    return n, nil
}

func main() {
    //使用errors.New生成error對象
    if result, err := Equal(20); err != nil {
        fmt.Println("錯誤:", err)
    } else {
        fmt.Println("結果:", result)
    }

    //不適用erros,自定義錯誤方式.
    if result, err := DiyEqual(20); err != nil {
        fmt.Println("錯誤:", err)
    } else {
        fmt.Println("結果:", result)
    }

}

當然實際開發項目也不建議這麼寫,太lower不說,也不好擴展. 下一篇準備寫個demo,封裝優化錯誤輸出的處理.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章