Go語言 異常panic和恢復(fù)recover用法

背景:Go語言追求簡(jiǎn)潔優(yōu)雅,所以,Go語言不支持傳統(tǒng)的 try…catch…finally 這種異常,因?yàn)镚o語言的設(shè)計(jì)者們認(rèn)為,將異常與控制結(jié)構(gòu)混在一起會(huì)很容易使得代碼變得混亂。因?yàn)殚_發(fā)者很容易濫用異常,甚至一個(gè)小小的錯(cuò)誤都拋出一個(gè)異常。在Go語言中,使用多值返回來返回錯(cuò)誤。不要用異常代替錯(cuò)誤,更不要用來控制流程。在極個(gè)別的情況下,才使用Go中引入的Exception處理:defer, panic, recover。

panic:
1、內(nèi)建函數(shù)
2、假如函數(shù)F中書寫了panic語句,會(huì)終止其后要執(zhí)行的代碼,在panic所在函數(shù)F內(nèi)如果存在要執(zhí)行的defer函數(shù)列表,按照defer的逆序執(zhí)行
3、返回函數(shù)F的調(diào)用者G,在G中,調(diào)用函數(shù)F語句之后的代碼不會(huì)執(zhí)行,假如函數(shù)G中存在要執(zhí)行的defer函數(shù)列表,按照defer的逆序執(zhí)行,這里的defer 有點(diǎn)類似 try-catch-finally 中的 finally
4、直到goroutine整個(gè)退出,并報(bào)告錯(cuò)誤

recover:
1、內(nèi)建函數(shù)
2、用來控制一個(gè)goroutine的panicking行為,捕獲panic,從而影響應(yīng)用的行為
3、一般的調(diào)用建議
a). 在defer函數(shù)中,通過recever來終止一個(gè)gojroutine的panicking過程,從而恢復(fù)正常代碼的執(zhí)行
b). 可以獲取通過panic傳遞的error

簡(jiǎn)單來講:go中可以拋出一個(gè)panic的異常,然后在defer中通過recover捕獲這個(gè)異常,然后正常處理。

示例代碼 main函數(shù)相當(dāng)于調(diào)用者G,f函數(shù)相當(dāng)于函數(shù)F

func main() {
      fmt.Println("c")
   defer func() { // 必須要先聲明defer,否則不能捕獲到panic異常
      fmt.Println("d")
      if err := recover(); err != nil {
         fmt.Println(err) // 這里的err其實(shí)就是panic傳入的內(nèi)容
      }
      fmt.Println("e")
   }()
   f() //開始調(diào)用f
   fmt.Println("f") //這里開始下面代碼不會(huì)再執(zhí)行
}

func f() {
   fmt.Println("a")
   panic("異常信息")
   fmt.Println("b") //這里開始下面代碼不會(huì)再執(zhí)行
}
-------output-------
c
a
d
異常信息
e

注意:利用recover處理panic指令,defer必須在panic之前聲明,否則當(dāng)panic時(shí),recover無法捕獲到panic.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Go入門 Go介紹 部落圖鑒之Go:爹好還這么努力? 環(huán)境配置 安裝 下載源碼編譯安裝 下載相應(yīng)平臺(tái)的安裝包安裝 ...
    齊天大圣李圣杰閱讀 4,774評(píng)論 0 26
  • Go 語言沒有像Java那樣的 try/catch 異常機(jī)制,它不能執(zhí)行拋異常操作,而是使用了panic 和 re...
    副班長(zhǎng)國(guó)偉閱讀 2,173評(píng)論 0 1
  • 剛?cè)肼毜娜A為人,在參加華為大學(xué)的培訓(xùn)時(shí),都會(huì)被告知華為有四條核心價(jià)值觀: 一切以客戶為中心 以奮斗者為本 長(zhǎng)期堅(jiān)持...
    柳樹之閱讀 4,690評(píng)論 6 16
  • 月光清冷,投在湖心亭中。 一曲陽關(guān)曲,響徹耳畔。男子順音走了過去,只見一名著素衣女子抱著琵琶背對(duì)著自己。 夫君終于...
    月下枝閱讀 172評(píng)論 0 0
  • 夏天的到來本來是令人欣喜的、愜意的??蔀楹稳缃窦依锏南s鳴鳥叫還有藍(lán)天白云成了夢(mèng)魘?還不是自己的處境所致。那顆年輕躁...
    越橘閱讀 421評(píng)論 0 0

友情鏈接更多精彩內(nèi)容