Go语言(九) 异常、错误

旅游时讯 2019-10-08


一、defer

defer确保在函数调用的时候执行(总是被执行),遵循 先进后出的原则,参数在 defer语句是计算

  1. func main()  {

  2.    defer fmt.Println(1)

  3.    defer fmt.Println(2)

  4.    fmt.Println(3)

  5.    return

  6.    fmt.Println(4)

  7. }

输出的顺序为 3 2 1

示例:创建一个文件

  1. func writeFile(fileName string){

  2.    file, e := os.Create(fileName)

  3.    if nil != e {

  4.        log.Println("异常:",e.Error())

  5.        return

  6.    }

  7.    //关闭io

  8.    defer file.Close()


  9.    //使用缓冲提高效率

  10.    writer := bufio.NewWriter(file)

  11.    // 保证释放 写入

  12.    defer writer.Flush()


  13.    fmt.Fprintln(writer,"Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。")

  14. }

二、panic

panic是用来表示非常严重的不可恢复的错误的,向外抛出异常,程序不在往下执行,逐层向上返回,并执行每一层上面的 defer;如果没有 recover,程序结束运行

panic("异常信息")

  1. func main()  {

  2.    defer fmt.Println(1)

  3.    defer fmt.Println(2)

  4.    fmt.Println(3)

  5.    panic("error....")

  6.    fmt.Println(4)

  7. }

输出的顺序为 3 2 1

三、recover

recover仅在 defer条用中执行,可以获取到 panic的信息,如无法处理,还可以重新 panic

  1. func tryRecover()  {

  2.    //使用 defer 保证该匿名方法总被执行

  3.    defer func() {

  4.        r := recover()

  5.        if err,ok := r.(error); ok{

  6.            fmt.Println("recover 异常信息是 ",err)

  7.        }else{

  8.            panic("不是error类型的错误.")

  9.        }

  10.    }()