这篇记录 go 中的错误处理:错误检测示例、panic & recover。
基础知识
- 没有异常机制;error 类型实现了 error 接⼝;可以通过 errors.New 来快速创建错误实例。
- 提倡快速失败,错误检测放在前面。
- panic ⽤于不可以恢复的错误,后面的代码不会执行,退出前会执⾏ defer 指定的内容(延迟函数,相当于finally);os.Exit 退出时不会调⽤ defer 指定的函数,不输出当前调⽤栈信息。
- recover 并不检测发生了什么错误,只是记录/忽略,如果系统中某些核心资源消耗完了,强制恢复后系统依然无法正常工作,导致 health check 失效。
简单语法示例
error类
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
| var LessThanTwoError = errors.New("n should be not less than 2") var LargerThenHundredError = 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, LargerThenHundredError } 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) { if v, err := GetFibonacci(1); err != nil { if err == LessThanTwoError { fmt.Println("It is less.") } t.Error(err) } else { t.Log(v) } }
|
panic & recover
| func TestPanicVxExit(t *testing.T) { defer func() { if err := recover(); err != nil { fmt.Println("recovered from ", err) } }() panic(errors.New("Something wrong!")) }
|