错误表示程序中出现了异常情况。 在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)
网友评论