您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關golang中的異常處理機制是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
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()
函數中,直至進程結束。
關于golang中的異常處理機制是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。