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,封裝優化錯誤輸出的處理.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM