go語言中使用defer、panic、recover處理異常
阿新 • • 發佈:2019-03-08
baidu 繼續 spa hello http tid 處理流 dex integer
go語言中的異常處理,沒有try...catch等,而是使用defer、panic、recover來處理異常。
1、首先,panic 是用來表示非常嚴重的不可恢復的錯誤的。在Go語言中這是一個內置函數,如果在程序中遇到異常,或者調用panic函數,程序會立即退出(除非recover)。如下代碼:
package main import "fmt" func main() { a := 10 b := 0 c := a / b fmt.Println(c) }
程序的輸出如下:
? demo06 go run main.go panic: runtime error: integer divide by zero goroutine 1 [running]: main.main() /Users/qstudy/myfiles/project/src/go_dev/day11/demo06/main.go:8 +0x11 exit status 2
在這個輸出中,我們可以看到有個panic。
2、defer能保證在函數結束最後執行該方法(有問題的或者引發panic的函數),但是有個條件:必須在錯誤出錯之前進行攔截,在錯誤出現後進行錯誤捕獲,如果在定義的方法中defer定義的方法如果在panic後面,defer定義的方法就無法執行到。如下代碼:
package main import "fmt" func test(i int) { var arr [10]int // 錯誤攔截必須配合defer使用,通過匿名函數使用,在錯誤之前引用 defer func() { err := recover() if err != nil { fmt.Println(err) } }() arr[i] = 123 fmt.Println(arr) } func main() { i := 10 test(i) fmt.Println("hello world") }
執行後輸出如下:
runtime error: index out of range hello world
從以上結果可以看出,如果panic被recover捕獲接收到,panic後的方法還是能繼續執行的。
來自一本書書上面的總結:
“當在一個函數執行過程中調用panic()函數時,正常的函數執行流程將立即終止,但函數中
之前使用defer 關鍵字延遲執行的語句將正常展開執行,之後該函數將返回到調用函數,並導致
逐層向上執行panic流程,直至所屬的goroutine 中所有正在執行的函數被終止。錯誤信息將被報
告,包括在調用panic()函數時傳入的參數,這個過程稱為錯誤處理流程。”
go語言中使用defer、panic、recover處理異常