zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    flask-login
    python3安装scrapy框架
    Redis--对象共享(整数型字符串)
    Redis--对象(type、encoding、ptr、lru、refcount)
    Redis--内存回收(引用计数法)
    Redis--跳跃表
    Redis--压缩列表(节约内存,连锁更新)
    Redis--整数集合(升降级)
    Redis--Rehash(h[0],h[1],rehashIdx, 渐进式)
    Redis--解决Hash表键冲突(单向链表next指针,表头)
  • 原文地址:https://www.cnblogs.com/liang1101/p/6623548.html
Copyright © 2011-2022 走看看