7.1 编写好的错误处理

peter
• 阅读 1258

Go 语言的错误机制

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

  1. 没有异常机制

  2. error 类型实现了 error 接口

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

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

最佳实践

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

测试实例 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)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

注意: 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)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
点赞
收藏
评论区
推荐文章

暂无数据