Go沒(méi)有像Java那樣的異常機(jī)制言询,它不能拋出異常俯萎。因?yàn)樵O(shè)計(jì)者們認(rèn)為,將異常與控制結(jié)構(gòu)混在一起容易使得代碼變得混亂运杭。于是乎引入Exception處理: defer,panic,recover;
簡(jiǎn)單描述:Go中可以拋出一個(gè)panic的異常夫啊,然后在defer中通過(guò)recover捕獲這個(gè)異常,然后正常處理辆憔。
例子代碼:
package main
import "fmt"
func demo(){
fmt.Println("Welcome, my name is fudomine")
panic(400)
fmt.Println("Hello")
}
func main(){
defer func(){
fmt.Println("defer start")
errorMsg := recover()
fmt.Println("Error msg :", errorMsg)
fmt.Println("defer end")
}()
demo()
}
運(yùn)行結(jié)果
運(yùn)行結(jié)果
defer
defer 英文原意: vi. 推遲撇眯;延期;服從 vt. 使推遲虱咧;使延期熊榛。
- Go語(yǔ)言中內(nèi)置函數(shù);類似于C/PHP的析構(gòu)函數(shù)腕巡,但它不是針對(duì)對(duì)象而是函數(shù)玄坦;
- 允許在函數(shù)中添加多個(gè)defer語(yǔ)句。當(dāng)函數(shù)執(zhí)行到最后時(shí)绘沉,這些defer語(yǔ)句會(huì)按照逆序執(zhí)行煎楣,最后該函數(shù)返回(類似堆棧,先進(jìn)后出)车伞。
- 調(diào)用時(shí)須在程序結(jié)束前調(diào)用择懂,簡(jiǎn)單來(lái)說(shuō)讓defer語(yǔ)句在return/panic前寫入至內(nèi)存中;
func demo()(str string){
str = "Hello"
defer func() {
str = "Welcome, my name is fudomine"
}()
return
}
返回結(jié)果:Welcome, my name is fudomine
func demo()(str string){
str = "Hello"
return
defer func() {
str = "Welcome, my name is fudomine"
}()
return
}
返回結(jié)果:Hello
可能會(huì)有小伙伴自己編寫代碼后,答案不一致另玖;為此特貼出不一樣結(jié)果的例子代碼并進(jìn)行分析困曙;
func demo()(string){
str := "Hello"
defer func() {
str = "Welcome, my name is fudomine"
}()
return str
}
原因:defer 中return xxx這一條語(yǔ)句并不是一條原子指令,而上面結(jié)果是因?yàn)槌跏蓟瘯r(shí)候就聲明輸出類型是*T(指針)谦去;
拆分為:
- 返回值 = xxx
- 調(diào)用defer函數(shù)
- 空的return
詳細(xì)請(qǐng)參考下《深入解析GO》一文
panic
panic 英文原意:n. 恐慌慷丽,驚慌;大恐慌 adj. 恐慌的哪轿;沒(méi)有理由的 vt. 使恐慌 vi. 十分驚慌
- Go是一個(gè)內(nèi)建函數(shù)盈魁,可以中斷原有的控制流程,進(jìn)入一個(gè)異常的流程中窃诉。當(dāng)函數(shù) Func 調(diào)用 panic 杨耙,函數(shù)Func 的執(zhí)行被中斷,但是 Func 中的延遲函數(shù)會(huì)正常執(zhí)行飘痛,然后Func 返回到調(diào)用它的地方珊膜。在調(diào)用的地方, Func 的行為就像調(diào)用了 panic 宣脉。這一過(guò)程繼續(xù)向上(只有剛才defer寸在內(nèi)存中车柠,將會(huì)被調(diào)用),直到發(fā)生 panic 的 goroutine 中所有調(diào)用的函數(shù)返回,此時(shí)程序退出竹祷。
recover
recover 英文原意: vt. 恢復(fù)谈跛;彌補(bǔ);重新獲得 vi. 恢復(fù)塑陵;勝訴感憾;重新得球 n. 還原至預(yù)備姿勢(shì)
- Go是一個(gè)內(nèi)建的函數(shù),可以讓進(jìn)入令人恐慌的流程中的 goroutine 恢復(fù)過(guò)來(lái)令花。 recover 僅在延遲函數(shù)中有效阻桅。在正常的執(zhí)行過(guò)程中,調(diào)用 recover 會(huì)返回 nil 兼都,并且沒(méi)有其它任何效果嫂沉。如果當(dāng)前的 goroutine 陷入恐慌,調(diào)用recover 可以捕獲到 panic 的輸入值扮碧,并且恢復(fù)正常的執(zhí)行趟章。
參考文獻(xiàn)
《go web編程》
作者:不動(dòng)峰
博客園:http://www.cnblogs.com/mylly/
版權(quán)所有,歡迎保留原文鏈接進(jìn)行轉(zhuǎn)載:)