Error

对于在Golang中的函数或者方法而言,错误的返回,需要放在最后一位。 对于习惯性的判断,一般将代表错误的返回值与nil进行比较,如果返回的是nil则表示没有错误发生。

类型定义

在Golang中,error的定义是一个接口,其里面只包含一个Error方法,该方法返回string类型错误信息

type error interface {
    Error() string
}

错误声明的方式

使用结构的字段

定义一个结构,然后使用结构来获取错误的信息,比如filepath包中的PathError结构,其定义如下:

type PathError struct {
    Op string
    Path string
    Err error
}

func (e *PathError) Error() string {
    return e.Op + " " + e.Path + ": " + e.Err.Error()
}

*PathError实现了Error接口,我们就可以如下利用其错误信息,组装自己的信息

func main(){
    f, err := os.Open("/test.txt")
    if err, ok := err.(*os.PathError); ok {
        fmt.Println("File at apath", err.Path,"failed to open")
    }
    fmt.Println(f.Name(), "opened successfully")
}
使用结构体的方法

比如DNSError结构体的定义如下:

type DNSError struct {
    ...
}

func (e *DNSError) Error() string {
    ...
}

func (e *DNSError) Timeout() bool {
    ...
}

func (e *DNSError) Temporary() bool {
    ...
}

因此在项目中我们可以依据其返回错误不同,进行不同的处理

func main() {
    addr, err := net.LookupAddr("www.baidu.com")
    if err, ok := err.(*net.DNSError); ok {
        if err.Timeout() {
            // ...
        } else if err.Temporary() {
            // ...
        } else {
            // ...
        }
        return
    }
    fmt.Println(addr)
}
直接比较

可以直接定义一个变量,然后再用来进行比较,例如filepath

var ErrBadPattern = errors.New("syntax error in pattern")

参考资料

results matching ""

    No results matching ""