Go語言中異常的使用及捕獲

不管使用什么語言寫的程序都會有異常少孝,這其中包括系統(tǒng)異常以及業(yè)務(wù)異常。

當(dāng)業(yè)務(wù)邏輯校驗錯誤的時候需要拋出一個業(yè)務(wù)異常溺忧。返回前臺一個比較有好的信息

如果存在一些不確定的異常我們應(yīng)該捕獲,并且執(zhí)行對應(yīng)的邏輯。其他語言中有try catch 那么go語言怎么來實現(xiàn)呢

下面我們先看一下go中的異常

拋出異常很簡單,只需要 panic 一下争剿,這個方法會終止程序

go中定義異常有兩種方式,一種是errors.New()痊末、另一種是定義一個結(jié)構(gòu)體實現(xiàn)Error方法

下面我們來使用一下

func main() {
    panic(errors.New("服務(wù)器異常"))
    fmt.Println("執(zhí)行業(yè)務(wù)")
}

報錯

panic: 服務(wù)器異常

goroutine 1 [running]:
main.main()
    /Users/wendell/GolandProjects/blog/error.go:50 +0x2c

大部分情況下蚕苇,我們不希望報錯的時候?qū)⒊绦蚪K止,可以使用 defer 與 recover 來捕獲異常

defer 不管業(yè)務(wù)正常結(jié)束還是拋出錯誤凿叠,在方法執(zhí)行結(jié)束時會執(zhí)行 defer 后面定義的函數(shù)

recover 捕獲異常

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("捕獲異常", err)
        }
    }()
    panic(errors.New("服務(wù)器異常"))
    fmt.Println("執(zhí)行業(yè)務(wù)")
}

執(zhí)行結(jié)果

捕獲異常 服務(wù)器異常

雖然捕獲到了異常涩笤,程序沒有因為異常而終止,但是卻沒有執(zhí)行后面的業(yè)務(wù)盒件,如果要保護后續(xù)代碼執(zhí)行蹬碧,要怎么做呢

上面說到 defer 是在方法結(jié)束時執(zhí)行,那么只需要上面報錯與捕獲邏輯不在一個方法內(nèi)就可以了炒刁,于是使用匿名函數(shù)重構(gòu)

func main() {
    func() {
        defer func() {
            if err := recover(); err != nil {
                fmt.Println("捕獲異常", err)
            }
        }()
        
        panic(errors.New("服務(wù)器異常"))
    }()
    
    fmt.Println("執(zhí)行業(yè)務(wù)")
}

執(zhí)行

捕獲異常 服務(wù)器異常
執(zhí)行業(yè)務(wù)

雖然現(xiàn)在達(dá)到了效果恩沽,但是如果業(yè)務(wù)中有許多這樣的地方,都要這么寫也挺麻煩翔始。那么有沒有像其它語言中try catch來處理呢

可以將 try 中的邏輯當(dāng)作一個函數(shù)罗心,catch 中的邏輯當(dāng)作一個函數(shù),如果有報錯執(zhí)行 catch 函數(shù)城瞎,于是封裝一個方法

func try(tryFunc func(), catchFunc func(interface{})) {
    defer func() {
        if err := recover(); err != nil {
            catchFunc(err)
        }
    }()

    tryFunc()
}

重構(gòu)代碼

func main() {
    try(func() {
        panic(errors.New("服務(wù)器異常"))
    }, func(err interface{}) {
        fmt.Println("捕獲異常", err)
    })

    fmt.Println("執(zhí)行業(yè)務(wù)")
}

執(zhí)行

捕獲異常 服務(wù)器異常
執(zhí)行業(yè)務(wù)

到這一個簡單的try catch就寫完了渤闷。

歡迎關(guān)注,學(xué)習(xí)不迷路全谤!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肤晓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌补憾,老刑警劉巖漫萄,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盈匾,居然都是意外死亡腾务,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門削饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岩瘦,“玉大人,你說我怎么就攤上這事窿撬∑裘粒” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵劈伴,是天一觀的道長密末。 經(jīng)常有香客問我,道長跛璧,這世上最難降的妖魔是什么严里? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮追城,結(jié)果婚禮上刹碾,老公的妹妹穿的比我還像新娘。我一直安慰自己座柱,他們只是感情好迷帜,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辆布,像睡著了一般瞬矩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锋玲,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音涵叮,去河邊找鬼惭蹂。 笑死,一個胖子當(dāng)著我的面吹牛割粮,可吹牛的內(nèi)容都是我干的盾碗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼舀瓢,長吁一口氣:“原來是場噩夢啊……” “哼廷雅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤航缀,失蹤者是張志新(化名)和其女友劉穎商架,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芥玉,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蛇摸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灿巧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶袄。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抠藕,靈堂內(nèi)的尸體忽然破棺而出饿肺,到底是詐尸還是另有隱情,我是刑警寧澤盾似,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布唬格,位于F島的核電站,受9級特大地震影響颜说,放射性物質(zhì)發(fā)生泄漏购岗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一门粪、第九天 我趴在偏房一處隱蔽的房頂上張望喊积。 院中可真熱鬧,春花似錦玄妈、人聲如沸乾吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绎签。三九已至,卻和暖如春酝锅,著一層夾襖步出監(jiān)牢的瞬間诡必,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工搔扁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爸舒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓稿蹲,卻偏偏與公主長得像扭勉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苛聘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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