美文网首页
Go语言学习笔记-错误类型

Go语言学习笔记-错误类型

作者: 努力的夏目_1bbc | 来源:发表于2018-12-11 21:28 被阅读0次

    错误表示程序中出现了异常情况。 在Go语言中,错误用内建的 error 类型来表示。
    就像其他的内建类型(如 int、float64 等),错误值可以存储在变量里,作为函数的返回值等等。

    一、

    下面的例子试图打开不存在的文件,os包的Open函数func Open(name string) (file *File, err error)如果异常会返回一个错误,没错时返回一个值为nil的错误。

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        
        f, err := os.Open("/test.txt")
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(f.Name(), "opened successfully")
    }
    

    惯例,Go中函数如果返回错误,会放在最后一个值返回,如Open函数。处理错误常与nil比较。

    二、错误类型的表示

    error是一个接口类型,定义如下:

    type error interface{
      Error()string
    }
    

    error 有了一个签名为 Error() string 的方法。所有实现该接口的类型都可以当作一个错误类型。Error() 方法给出了错误的描述。(在fmt.Println打印错误时,会在内部调用Error()string方法得到该错误的描述。“一”里的打开文件的例子一样。)

    三、使用结构体字段获得更多错误的信息

    1.第一步就是创建一个表示错误的结构体类型
    2.下一步是实现 error 接口。Error() string 方法。

    Open函数的返回错误类型是*PathError,是一个结构体类型,它在标准库中的实现如下:

    type PathError struct { 
    Op string
    Path string
    Err error//存储实际的错误信息
    }
    func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
    

    3.使用结构体类型的错误还可以添加除了Error()string的其他方法提供更多错误信息
    例:

    package main
    
    import (
        "fmt"
    )
    
    type areaError struct {
        err    string  //error description
        length float64 //length which caused the error
        width  float64 //width which caused the error
    }
    
    func (e *areaError) Error() string {
        return e.err
    }
    func (e *areaError) lengthNegative() bool {
        return e.length < 0
    }
    func (e *areaError) widthNegative() bool {
        return e.width < 0
    }
    
    //rectArea返回面积和一个错误类型
    func rectArea(length, width float64) (float64, error) {
        err := ""
        if length < 0 {
            err += "length is less than zero"
        }
        if width < 0 {
            if err == "" {
                err = "width is less than zero"
            } else {
                err += ", width is less than zero"
            }
        }
        if err != "" {
            return 0, &areaError{err, length, width}
        }
        return length * width, nil
    }
    
    func main() {
        length, width := -5.0, -9.0
        area, err := rectArea(length, width)
        if err != nil {
    //转换为自定义的错误类型使用实现的两个方法
            if err, ok := err.(*areaError); ok {
    //使用这两个方法判断是否小于零
                if err.lengthNegative() {
                    fmt.Printf("error: length %0.2f is less than zero\n", err.length)
                }
                if err.widthNegative() {
                    fmt.Printf("error: width %0.2f is less than zero\n", err.width)
                }
                return
            }
            fmt.Println(err)
            return
        }
        fmt.Println("area of rect", area)
    }
    
    
    四、自定义错误

    1.使用errors包New函数实现
    例:
    errors.New("Area calculation failed, radius is less than zero")
    2.使用 Errorf 给错误添加更多信息
    如果想打印变量之类的信息,可以用fmt包Errorf打印
    fmt.Errorf("Area calculation failed, radius %0.2f is less than zero", radius)

    相关文章

      网友评论

          本文标题:Go语言学习笔记-错误类型

          本文链接:https://www.haomeiwen.com/subject/lptjhqtx.html