Go笔记(4)错误处理

这篇记录 go 中的错误处理:错误检测示例、panic & recover。

基础知识

  1. 没有异常机制;error 类型实现了 error 接⼝;可以通过 errors.New 来快速创建错误实例。
  2. 提倡快速失败,错误检测放在前面。
  3. panic ⽤于不可以恢复的错误,后面的代码不会执行,退出前会执⾏ defer 指定的内容(延迟函数,相当于finally);os.Exit 退出时不会调⽤ defer 指定的函数,不输出当前调⽤栈信息。
  4. 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

1
2
3
4
5
6
7
8
func TestPanicVxExit(t *testing.T) {
defer func() { // 延迟函数,相当于finally,一定会执行。
if err := recover(); err != nil {
fmt.Println("recovered from ", err)
}
}()
panic(errors.New("Something wrong!")) // panic程序异常中断,不可修复的错误。后面的代码不会执行。
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!