Go语言学习笔记 --- defer 、panic 、recover

原创 2017年08月13日 11:34:47

学习笔记根据 无闻 go语言基础教程 整理

defer、panic、recover

  • 执行方式类似其他语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行
  • 即使函数发生严重错误也会执行,类似finally
  • 支持匿名函数的调用
  • 常用于文件清理、文件关闭、解锁以及记录时间等操作
  • 通过与匿名函数配合可在return之后修改函数计算结果
  • 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已获得了拷贝,否则则是引用某个变量的地址
  • Go 中没有异常机制,但有panic/recover模式来处理错误
  • panic 可以在任何地方引发,但recover只有在defer调用函数中有效
  • 示例代码:
package main

import (
    "fmt"
)

func main() {

}

// defer 定义的先被调用,逆序向上调用
func test1() {
    fmt.Println("a")
    defer fmt.Println("b")
    defer fmt.Println("c")
    /*
    // 输出结果
    a
    c
    b

    */
}

// 继续测试,逆向调用
func test2() {
    for i := 0; i < 3; i++ {
        defer fmt.Println(i)
    }
    /*
    // 输出结果
    2
    1
    0

    */
}

// 使用匿名函数测试
func test3() {
    for i := 0; i < 3; i++ {
        defer func () {
            fmt.Println(i) // 此时defer改变了i作为地址的引用,一直引用这个局部变量i
        }()
    }
    /*
    // 输出结果
    3
    3
    3

    */
}

// 测试panic
func test4() {
    fmt.Println("Func in 4")
}

func test5() {
    // defer 函数必须先调用,然后再执行panic
    // 通过defer把程序从panic状态recover恢复回来
    defer func() {
        if err:=recover(); err != nil {
            fmt.Println("Recover in 5")
        }
    }
    panic("Panic in 5") // panic之后的所有语句都不会执行
}

func test6() {
    fmt.Println("Func in 6")
}

func test456T() {
    test4() // Func in 4
    test5() // Recover in 5
    test6() // Func in 6
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Go语言中使用panic和recover简化错误处理

随着使用golang越来越频繁,发现golang有一个地方非常不方便,就是在错误处理方面。先来看看golang中通常的错误处理方法: 通常的error处理 1 2 3 ...
  • kenkao
  • kenkao
  • 2015年08月22日 11:19
  • 4419

GO panic和recover的用法

golang中没有try ... catch...这类异常捕获语句,但是提供了panic和recover内建函数,用于抛出异常以及异常的捕获。 1、Panic The usual way to re...
  • wo198711203217
  • wo198711203217
  • 2017年03月25日 11:02
  • 1042

理解Defer、Panic和Recover

刚开始的时候理解如何使用Defer和Recover有一点怪异,尤其是使用了try/catch块的时候。有一种模式可以在Go中实现和try/catch语句块一样的效果。不过之前你需要先领会Defer、P...
  • future_challenger
  • future_challenger
  • 2015年08月30日 15:53
  • 713

go语言之 panic, recover ——如何在go语言中优雅的处理错误

如何在go语言中优雅的处理错误 如何理解go语言中的 panic 和 recover
  • lingyun1981
  • lingyun1981
  • 2016年09月04日 17:36
  • 2602

Go编程基础—defer、return、返回值之间执行顺序的坑

Golang中defer、return、返回值之间执行顺序的坑Go语言中延迟函数defer充当着 cry…catch 的重任,使用起来也非常简便,然而在实际应用中,很多gopher并没有真正搞明白de...
  • qq_22063697
  • qq_22063697
  • 2017年07月09日 16:37
  • 501

golang中的defer panic recover

大家都知道golang里的panic相当于其他语言里的throw,而recover相当于其他语言里的cacth,可是由于golang的recover机制要求必须在defer的函数里才能执行catch ...
  • HopingWhite
  • HopingWhite
  • 2013年04月18日 10:22
  • 3669

Golang---Defer, Panic, and Recover

defer 语句可以将一个函数放入一个链表。当调用这个 defer 语句的函数返回时,保存在链表中的所有函数将会被调用。一般情况下,defer 语句用来进行简单的各种清理工作。 Panic 是内置函数...
  • DowntownGuy
  • DowntownGuy
  • 2015年12月16日 18:39
  • 456

GO defer panic recover

package main import ( "fmt" ) func main() { A() B() C() } func A() { fmt.Println("Func A()...
  • haifengzhilian
  • haifengzhilian
  • 2017年05月08日 13:45
  • 253

Go语言panic和recover使用

package main import ( "fmt" ) func main() { f() fmt.Println("Returned normally from f....
  • fyxichen
  • fyxichen
  • 2015年05月11日 11:28
  • 763

golang异常panic和恢复recover用法

go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理 在一个主进程,多个go程处理逻辑的结构中,这个很重要,如果不用recover捕获panic异常,会...
  • ghost911_slb
  • ghost911_slb
  • 2012年08月05日 10:06
  • 23982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Go语言学习笔记 --- defer 、panic 、recover
举报原因:
原因补充:

(最多只允许输入30个字)