Go 教程
1. Go 语言教程 2. Go 语言环境安装 3. Go 语言结构 4. Go 语言基础语法 5. Go 语言数据类型 6. Go 语言变量 7. Go 语言常量 8. Go 语言运算符 9. Go 语言条件语句 10. Go 语言循环语句 11. Go 语言函数 12. Go 语言变量作用域 13. Go 语言数组 14. Go 语言指针 15. Go 语言结构体 16. Go 语言切片(Slice) 17. Go 语言范围(Range) 18. Go 语言Map(集合) 19. Go 语言递归函数 20. Go 语言类型转换 21. Go 语言接口 22. Go 错误处理 23. Go 语言开发工具

Go 错误处理

Go 错误处理

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。

error类型是一个接口类型,这是它的定义:


type error interface {

    Error() string

}

我们可以在编码中通过实现 error 接口类型来生成错误信息。

函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息:


func Sqrt(f float64) (float64, error) {

    if f < 0 {

        return 0, errors.New("math: square root of negative number")

    }

    // 实现

}

在下面的例子中,我们在调用Sqrt的时候传递的一个负数,然后就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输出错误,请看下面调用的示例代码:


result, err:= Sqrt(-1)



if err != nil {

   fmt.Println(err)

}

实例

实例

package main

import (
    "fmt"
)

// 定义一个 DivideError 结构
type DivideError struct {
    dividee int
    divider int
}

// 实现 `error` 接口
func (de *DivideError) Error() string {
    strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`

    return fmt.Sprintf(strFormat, de.dividee)
}

// 定义 `int` 类型除法运算的函数
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
    if varDivider == 0 {
            dData := DivideError{
                    dividee: varDividee,
                    divider: varDivider,
            }
            errorMsg = dData.Error()
            return
    } else {
            return varDividee / varDivider, ""
    }

}

func main() {

    // 正常情况
    if result, errorMsg := Divide(100, 10); errorMsg == "" {
            fmt.Println("100/10 = ", result)
    }
    // 当除数为零的时候会返回错误信息
    if _, errorMsg := Divide(100, 0); errorMsg != "" {
            fmt.Println("errorMsg is: ", errorMsg)
    }

}

执行以上程序,输出结果为:


100/10 =  10

errorMsg is:  

    Cannot proceed, the divider is zero.

    dividee: 100

    divider: 0