Go错误机制
- 没有异常机制
- error类型实现了error接口
- 可以通过
errors.New来快速创建错误实例
type error interface {
Error() string
}
errors.New("n must be in the range [0, 1, 2]")
最佳实践
- 定义不同的错误变量,以便于判断错误类型
var (
LessThanError = errors.New("n should be less than 2")
LargeThanError = errors.New("n should be large than 100")
)
func GetFibonacci(n int) ([]int, error) {
if n < 0 {
return nil, LessThanError
}
if n > 100 {
return nil, LargeThanError
}
fibList := []int{1, 2}
for i := 2; i < n; i++ {
fibList = append(fibList, fibList[i-2]+fibList[i-1])
}
return fibList, nil
}
func TestGetFibonacci(t *testing.T) {
if v, err := GetFibonacci(-10); err != nil {
if err == LessThanError {
t.Log("need a larger number")
} else if err == LargeThanError {
t.Log("need a less number")
} else {
t.Error(err)
}
} else {
t.Log(v)
}
}
- 及早判断,避免嵌套
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)
}
panic
- panic用于不可以回复的错误
- panic退出前汇之星defer指定的内容
panic VS os.Exit
os.Exit退出时不会调用defer指定的函数os.Exit退出时不输出当前调用栈信息
recover
该方法的出现是为了防止程序因未知的panic错误而导致程序不能继续运行而生的。简单来说就是hook住错误
有点类似其他语言中的catch语法
最常见的错误恢复:
func TestPanicVxExit(t *testing.T) {
defer func() {
if err := recover(); err != nil {
fmt.Println("recovered from ", err)
}
}()
}
但是,这样做其实意义不大,表面上看,程序是还在运行着,但是本质上程序已经不作任何事情了,从而导致形成僵尸服务进行,如果这样还不如直接让程序crash