国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

深入理解golang的異常處理機制

2020-04-01 19:04:45
字體:
來源:轉載
供稿:網友

前言

眾所周知在java或php等很多面向對象的語言中, 異常處理是依靠throw、catch來進行的。在go語言中,panic和recover函數在作用層面分別對等throw和catch語句,當然也存在不同之處。下面話不多說,來一起看看詳細的介紹吧。

從設計層面來看,panic和recover函數適用于那些真正的異常(例如整數除0),而throw catch finally機制常常被用來處理一些業務層面的自定義異常。因此在go語言中,panic和recover要慎用。

上述兩種異常機制的使用中,在處理異常時控制流程的走向也是相似的。

下面將分別舉例說明:

try catch finally機制

 try{ throw new Exception(); } catch(Exception $e) { do something ... } finally {  }

這種機制中,我們把可能拋出異常的語句或拋出自定義異常的語句放置到try語句塊中,而在catch塊中,我們將上述語句拋出的異常捕獲,針對不同的異常進行報警或log等處理。之后,控制流程進入到finally語句塊中。若沒有finally語句,控制流程將進入到catch之后的語句中。也就是說,在這種機制中,控制流程是轉移到同一層級中異常捕獲之后的語句中。

panic recover defer機制

在go的異常機制中,panic可以將原有的控制流程中斷,進入到一個"恐慌"流程。這種恐慌流程可以顯式調用panic()函數產生或者由運行時錯誤產生(例如訪問越界的數組下標)。panic會在調用它的函數中向本層和它的所有上層逐級拋出,若一直沒有recover將其捕獲,程序退出后會產生crash;若在某層defer語句中被recover捕獲,控制流程將進入到recover之后的語句中。

 /* example 1 */ package main import ( "fmt" ) func f() { defer func() {  fmt.Println("b")  if err := recover();err != nil {  fmt.Println(err)  }  fmt.Println("d") }() fmt.Println("a") panic("a bug occur") fmt.Println("c") } func main() { f() fmt.Println("x") }

在上述舉例中,輸出結果為:

 a b a bug occur d x

這說明,在f函數中拋出的panic被自己defer語句中的recover捕獲,然后控制流程進入到recover之后的語句中,即打印d、打印x,之后進程正常退出。

 /* example 2 */ package main import (  "fmt" ) func g() {  defer func() {   fmt.Println("b")   if err := recover();err != nil {    fmt.Println(err)   }   fmt.Println("d")  }()  f()  fmt.Println("e") } func f() {  fmt.Println("a")  panic("a bug occur")  fmt.Println("c") } func main() {  g()  fmt.Println("x") }

上述案例的輸出結果是:

 a b a bug occur d x

進程經歷了這樣一個過程:f()中拋出panic,由于自身沒有定義defer語句,panic被拋到g()中。g()的defer語句中定義了recover,捕獲panic后并執行完defer剩余的語句,之后控制流程被轉交到main()函數中,直至進程結束。

總結

以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 同心县| 库车县| 苍溪县| 文山县| 剑阁县| 宣化县| 白沙| 临泉县| 甘孜县| 辽中县| 光山县| 曲松县| 长葛市| 桐乡市| 阿拉善右旗| 南宁市| 特克斯县| 湟中县| 丹江口市| 襄垣县| 大冶市| 扶风县| 泰宁县| 天门市| 黑水县| 梨树县| 宜城市| 延吉市| 遂宁市| 宁阳县| 缙云县| 广德县| 抚宁县| 梁河县| 信丰县| 江源县| 滁州市| 阳西县| 兴义市| 千阳县| 谷城县|