Go的错误机制

45 阅读1分钟

Go错误机制

  1. 没有异常机制
  2. error类型实现了error接口
  3. 可以通过errors.New来快速创建错误实例
type error interface {
    Error() string
}

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

最佳实践

  1. 定义不同的错误变量,以便于判断错误类型
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)
   }
}
  1. 及早判断,避免嵌套
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