Go语言异常处理defer\panic\recover

Go语言追求简单优雅,所以,Go语言不支持传统的 try…catch…finally
这种异常,因为Go语言的设计者们认为,将死以及控制结构混在联合会很轻使代码变得乱七八糟。因为开发者很易滥用异常,甚至一个细微的不当还丢来一个好。在Go语言中,使用多值返回来返回错误。不要用老代替错误,更不用为此来决定流程。在尽个别的图景下,也就是说,遇到真正的万分的情况下(比如除数为
0了)。才以Go中引入的Exception处理:defer, panic, recover。

随即几乎只很的动状况可以这样简单描述:Go中可以抛出一个panic的不行,然后于defer中经recover捕获之非常,然后正常处理。

事例代码:

package main



import "fmt"



func main(){

    defer func(){ // 必须要先声明defer,否则不能捕获到panic异常

        fmt.Println("c")

        if err:=recover();err!=nil{

            fmt.Println(err) // 这里的err其实就是panic传入的内容,55

        }

        fmt.Println("d")

    }()

    f()

}



func f(){

    fmt.Println("a")

    panic(55)

    fmt.Println("b")

    fmt.Println("f")

}

输出结果:

a
c
55
d
exit code 0, process exited normally.

参考: http://blog.csdn.net/ghost911_slb/article/details/7831574

defer

defer 英文原意: vi. 推迟;延期;服从   vt. 使推迟;使延期。

defer的思考相近于C++中之析构函数,不过Go语言中“析构”的非是目标,而是函数,defer就是用来补偿加函数了时实行之说话。注意这里强调的凡增长,而不是点名,因为不同让C++中之析构函数是静态的,Go中的defer是动态的。

func f() (result int) {
  defer func() {
    result++
  }()
  return 0
}

点的函数就归回0了,因为还从未赶趟添加defer的东西,函数就回了。

另外值得一提的凡,defer可以数,这样形成一个defer栈,后defer的语句以函数返回时将先叫调用。

参考: http://weager.sinaapp.com/?p=31

panic

panic 英文原意:n. 恐慌,惊慌;大恐慌  adj. 恐慌的;没有理由的  vt.
使恐慌  vi. 十分惊魂未定

panic
是因此来表示充分严重的不得恢复的错的。在Go语言中马上是一个搭函数,接收一个interface{}类型的值(也就是是另外价值了)作为参数。panic
的意图就是如我们平常接触的良。不过Go可没有try…catch,所以,panic一般会促成程序挂掉(除非recover)。所以,Go语言中之雅,那真的是死了。你可试试,调用panic看看,程序及时挂掉,然后Go运行时会见打印出调用栈。
然而,关键的少数是,即使函数执行之上
panic了,函数不往下活动了,运行时并无是立提高传递panic,而是到defer那,等defer的物都飞了了,panic再前进传递。所以这
defer 有点类似 try-catch-finally 中之 finally。
panic就是这样简单。抛来个真含义上的老大。

recover

recover 英文原意: vt. 恢复;弥补;重新赢得   vi. 恢复;胜诉;重新得球  
n. 还原到预备姿势

方说到,panic的函数并无会见马上回到,而是先defer,再回去。这时候(defer的时光),如果起点子用panic捕获到,并堵住panic传递,那就是格外的处理体制就算应有尽有了。

Go语言提供了recover内置函数,前面提到,一旦panic,逻辑就是会走及defer那,那我们不怕在defer那顶正在,调用recover函数将会见捕获到眼前之panic(如果有些话),被破获到之panic就未会见提高传递了,于是,世界恢复了和平。你可提到你想干的事体了。

而若是小心的凡,recover之后,逻辑并无会见死灰复燃到panic那个点去,函数还是碰头以defer之后归。

从而Go实现类似 try catch 的老大处理发生个例子在:

http://www.douban.com/note/238705941/

结论:

Go没有全面否定异常的存,同时用力不鼓励多为此特别。

参考:http://blog.dccmx.com/2012/01/exception-the-go-way/

http://kejibo.com/golang-exceptions-handle-defer-try/

http://bookjovi.iteye.com/blog/1335282

https://github.com/astaxie/build-web-application-with-golang/blob/master/02.3.md