Go 语言的错误机制
与其他主要编程语言的差异
没有异常机制
error 类型实现了 error 接口
type error interface { Error() string }
可以通过 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)
}