7.1 编写好的错误处理
peter 137 3

Go 语言的错误机制

与其他主要编程语言的差异

  1. 没有异常机制

  2. error 类型实现了 error 接口

    type error interface {
      Error() string
    }
  3. 可以通过 errors.News 来快速创建错误实例

    errors.New("n must be in the range [0, 10]")

最佳实践

定义不同的错误变量,以便于判断错误类型

测试实例 1

package error

import (
    "errors"
    "fmt"
    "testing"
)

var LessThanTwoError = errors.New("n should be not less than 2")
var LargeThanHundredError = errors.New("n should be not larger than 100")

func GetFibonacci(n int) ([]int, error) {
    if n < 2 {
        return nil, LessThanTwoError
    }
    if n > 100 {
        return nil, LargeThanHundredError
    }
    fibList := []int{1, 1}

    for i := 2; i < n; i++ {
        fibList = append(fibList, fibList[i-2]+fibList[i-1])
    }
    return fibList, nil
}

func TestGetFibonacci(t *testing.T) {
    n := 1
    if v, err := GetFibonacci(n); err != nil {
        if err == LessThanTwoError {
            fmt.Println("It is less.")
        }
    } else {
        t.Log(v)
    }
}

注意: Go 语言编程时强调快速失败,避免嵌套。

测试实例 2

// 不好的写法
func GetFibonacci1(str string) {
    var (
        i int
        err error
        list []int
    )
    if i, err = strconv.Atoi(str); err == nil {
        if list, err = GetFibonacci(i); err == nil {
            fmt.Println(list)
        } else {
            fmt.Println("Error", err)
        }
    } else {
        fmt.Println("Error", err)
    }
}

// 正确的写法
// 在所有的错误都没有出现错误时,输出错误机制
func GetFibonacci2(str string) {
    var (
        i int
        err error
        list []int
    )
    if i, err = strconv.Atoi(str); err != nil {
        fmt.Println("Error", err)
        return
    }
    if list, err = GetFibonacci(i); err != nil {
        fmt.Println("Error", err)
        return
    }
    fmt.Println(list)
}
预览图
评论区

索引目录