Go 學(xué)習(xí)之路: 異常處理defer,panic乡恕,recover

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)載:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慎王,一起剝皮案震驚了整個(gè)濱河市尤揣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柬祠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件负芋,死亡現(xiàn)場(chǎng)離奇詭異漫蛔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)旧蛾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門莽龟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锨天,你說(shuō)我怎么就攤上這事毯盈。” “怎么了病袄?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵悠瞬,是天一觀的道長(zhǎng)丽已。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么摄欲? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮骗随,結(jié)果婚禮上聘裁,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好齿诞,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布酸休。 她就那樣靜靜地躺著,像睡著了一般祷杈。 火紅的嫁衣襯著肌膚如雪斑司。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天吠式,我揣著相機(jī)與錄音陡厘,去河邊找鬼。 笑死特占,一個(gè)胖子當(dāng)著我的面吹牛糙置,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播是目,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼谤饭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了懊纳?” 一聲冷哼從身側(cè)響起揉抵,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗤疯,沒(méi)想到半個(gè)月后冤今,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茂缚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年戏罢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚囊。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡龟糕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悔耘,到底是詐尸還是另有隱情讲岁,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布衬以,位于F島的核電站缓艳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏看峻。R本人自食惡果不足惜郎任,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望备籽。 院中可真熱鬧舶治,春花似錦分井、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惜浅,卻和暖如春瘫辩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坛悉。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工伐厌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裸影。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓挣轨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親轩猩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卷扮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容