這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go中的Exception處理採用什麼機制?
一句話總結:
Go中可以拋出一個panic的異常,然後在defer中通過recover捕獲這個異常,然後正常處理。
package mainimport "fmt"func main() { defer func() { // 必須要先聲明defer,否則不能捕獲到panic異常 fmt.Println("1") if err := recover(); err != nil { fmt.Println(err) // 這裡的err其實就是panic傳入的內容,the program is crashed } fmt.Println("2") }() ftest() f()}func f() { fmt.Println("b") panic("the program is crashed") fmt.Println("c")}func ftest() { defer fmt.Println("AA") defer fmt.Println("BB") fmt.Println("CC") return fmt.Println("DD")}
你可能跟我第一次一樣,腦海裡有如下疑問:
- Q1 : defer什麼時候執行?
- Q2 : 程式中多個defer關鍵字,按什麼順序執行?
- Q3 : recover恢複後,程式*會不會返回到異常發生的地方繼續朝下運行?
咱們根據執行結果逐個回答?
CCBBAAb1the program is crashed2
A1 : CC
列印完後程式return,然後列印BB
,說明函數返回前增加defer語句的執行,不列印DD
,說明defer必須寫在程式return前才會在返回前增加執行
A2 : 先列印BB
後列印AA
,說明defer執行順序為後聲明的先執行
A3 : 程式不列印c
,說明recover恢複後程式*不會返回到異常發生的地方繼續朝下運行
Reference:
http://www.cnblogs.com/ghj1976/archive/2013/02/11/2910114.html