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

错误表示程序中出现了异常情况。 在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语言学习笔记-错误类型)