错误处理

  1. defer
    defer 关键字,用于延迟执行一个函数在函数结束前执行
    其执行顺序为 先进后出,可以理解为栈

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    defer fmt.Println(1)
    defer fmt.Println(2)
    defer fmt.Println(3)
    fmt.Println(4)

    4
    3
    2
    1
    */
    //eg:写文件
    file, err := os.Create("a.txt")
    if err != nil {
    panic(err)
    }
    defer file.Close()
    writer := bufio.NewWriter(file)
    defer writer.Flush()
    for i := 0; i < 10; i++ {
    fmt.Fprintln(writer, i)
    }
  2. 错误处理

    1. panic

      停止当前函数执行

      向上返回,执行每一层的defer

      如果没有遇到revocer 程序退出

    2. recover

      仅在 defer 中调用

      获取panic值

      如果无法处理,可以重新panic

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      defer func() {
      r := recover()
      if err, ok := r.(error); ok {
      fmt.Println(err)
      } else {
      panic(fmt.Sprintln("unknown err:", r))
      }
      }()
      panic(errors.New("this is an error"))

      this is an error
      */
      panic(1234)

      panic: 123 [recovered]
      panic: unknown err: 123
      */
      1. error接口