Coding With Fun
Home Docker Django Node.js Articles Python pip guide FAQ Policy

Go error handling


May 11, 2021 Go


Table of contents


Go error handling

The Go language provides a very simple error handling mechanism through the built-in error interface.

The error type is an interface type, which is its definition:

type error interface {
    Error() string
}

We can generate error messages in encoding by implementing the error interface type.

The function usually returns an error message in the last return value. U se errors. New returns an error message:

func Sqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("math: square root of negative number")
    }
    // 实现
}

In the following example, we pass a negative number when we call Sqrt, and then we get the non-nil error object, which compares this object to nil, and the result is true, so fmt. Println (the fmt package calls the Error method when handling error) is called to output the error, see the sample code called below:

result, err:= Sqrt(-1)

if err != nil {
   fmt.Println(err)
}

Instance

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)
    }

}

The above procedure is performed and the output is:

100/10 =  10
errorMsg is:  
   Cannot proceed, the divider is zero.
  dividee: 100
  divider: 0