Go語言 異常panic和恢復recover用法


Go語言 異常panic和恢復recover用法

背景:Go語言追求簡潔優雅,所以,Go語言不支持傳統的 try…catch…finally 這種異常,因為Go語言的設計者們認為,將異常與控制結構混在一起會很容易使得代碼變得混亂。因為開發者很容易濫用異常,甚至一個小小的錯誤都拋出一個異常。在Go語言中,使用多值返回來返回錯誤。不要用異常代替錯誤,更不要用來控制流程。在極個別的情況下,才使用Go中引入的Exception處理:defer, panic, recover。

 

panic:

1、內建函數
2、假如函數F中書寫了panic語句,會終止其后要執行的代碼,在panic所在函數F內如果存在要執行的defer函數列表,按照defer的逆序執行
比如panic函數內有:
defer   函數1
defer   函數2
defer   函數3
那么執行順序就是:
函數3
函數2
函數1
3、返回函數F的調用者G,在G中,調用函數F語句之后的代碼不會執行,假如函數G中存在要執行的defer函數列表,按照defer的逆序執行,這里的defer 有點類似 try-catch-finally 中的 finally
4、直到goroutine整個退出,並報告錯誤
 

recover:

1、內建函數
2、用來控制一個goroutine的panicking行為,捕獲panic,從而影響應用的行為
3、一般的調用建議
a). 在defer函數中,通過recever來終止一個gojroutine的panicking過程,從而恢復正常代碼的執行
b). 可以獲取通過panic傳遞的error
簡單來講:go中可以拋出一個panic的異常,然后在defer中通過recover捕獲這個異常,然后正常處理。
示例代碼  main函數相當於調用者G,f函數相當於函數F
func main() {
      fmt.Println("c")
   defer func() { // 必須要先聲明defer,否則不能捕獲到panic異常
      fmt.Println("d")
      if err := recover(); err != nil {
         fmt.Println(err) // 這里的err其實就是panic傳入的內容
      }
      fmt.Println("e")
   }()
   f() //開始調用f
   fmt.Println("f") //這里開始下面代碼不會再執行
}
 
func f() {
   fmt.Println("a")
   panic("異常信息")
   fmt.Println("b") //這里開始下面代碼不會再執行
}
-------output-------
c
a
d
異常信息
e

  

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM