• GO_10:GO语言基础之error


    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    //被除数
    }
    
    // 为DivideError绑定Error方法,实现 error 接口
    func (de *DivideError)Error() string {
        //使用单反引号可以使输入的内容书写格式更加好看
        strFormat := `
            Cannot procceed, the divider is zero.
            dividee: %d
            divider: 0
            `
        return fmt.Sprintf(strFormat, de.dividee)
    }
    
    // 定义 int 类型除法运算的函数
    func Divide(varDividee int, varDivider int) (result int, errorMessage string) {
        if varDivider == 0 {
            //简单方法的实例化结构体
            dData := DivideError{
                dividee: varDividee,
                divider: varDivider,
            }
            errorMessage = dData.Error() //调用方法得到对应错误信息
            return
        } else {
            return varDividee / varDivider, ""
        }
    }
    
    func main()  {
        // 正常情况
        if result, errorMessage := Divide(100, 6); errorMessage == "" {
            fmt.Println("100 / 6 = ", result)
        }
    
        // 当除数为0的时候会返回错误信息
        if _, errorMessage := Divide(100, 0); errorMessage != "" {
            fmt.Println("errorMessage is : ", errorMessage)
        }
    }

    运行结果:

    100 / 6 =  16
    errorMessage is :  
            Cannot procceed, the divider is zero.
            dividee: 100
            divider: 0
  • 相关阅读:
    BZOJ 1046: [HAOI2007]上升序列(LIS)
    BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)
    UVa 12299 RMQ with Shifts(线段树)
    NOIP2010提高组] CODEVS 1069 关押罪犯(并查集)
    [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
    scp 远程文件拷贝命令
    mysql yum源安装极速
    ssh pubkey免密登陆远程主机
    paramiko linux pip18.1
    python3 linux
  • 原文地址:https://www.cnblogs.com/liang1101/p/6623548.html
Copyright © 2020-2023  润新知