美文网首页
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)

相关文章

  • 笨办法学golang(三)

    这是Go语言学习笔记第三篇。 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 Go语言基本类型主要有布...

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

    错误表示程序中出现了异常情况。 在Go语言中,错误用内建的 error 类型来表示。就像其他的内建类型(如 int...

  • golang

    golang go和php的区别类型:go为编译性语言;php解释性语言错误:go的错误处理机制;php本身或者框...

  • 初识Go语言-1

    Go语言学习路径 初识Go语言 Go语言环境搭建与IDE安装 Go语言基础语法 Go语言数据类型 Go语言变量和常...

  • 笨办法学golang(二)

    这是Go语言学习笔记的第二篇文章。 Go语言学习笔记参考书籍「Go语言编程」、Go官方标准库 前文提要 上篇文章中...

  • 笨办法学golang(四)

    这是Go语言学习笔记的第四篇 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 数组 数组是指一系列同类...

  • go语言-error 简版记录

    go语言中错误分为error和panic error 1.错误变量 2.自定义错误类型 3.错误类型返回 pani...

  • Go语言学习笔记 - 类型

    序 一直在关注Golang的发展,最近Go 1.7也发布了,于是下定决心学习Golang。本文是《Go 学习笔记》...

  • go语言学习笔记——类型

    在介绍类型之前,首先要看下变量和常量,因为类型是修饰他们的,类型决定了变量的长度和存储方式。常量和变量的区别:1、...

  • 02-Go语言常量和变量

    Go语言的数据类型 C语言的数据类型 Go语言的数据类型 Go语言各数据类型占用内存空间 Go语言中也可以使用si...

网友评论

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

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