處理普通錯誤 參考文章https://www.runoob.com/go/go-...
參考1: http://www.topgoer.com/函數/...
參考2: https://zhuanlan.zhihu.com/p/...html
Golang 沒有結構化異常,使用 panic 拋出錯誤,recover 捕獲錯誤。異常的使用場景簡單描述:Go中能夠拋出一個panic的異常,而後在defer中經過recover捕獲這個異常,而後正常處理。golang
package main import ( "fmt" ) // 舉例除數爲0 func main() { var a1 int = 2 var b1 int = 0 // 猶豫除數爲0 報錯終止 res1 := divisionIntRecover(a1, b1) fmt.Println("res1",res1) // 下面的語句沒法正常運行 var a2 int = 2 var b2 int = 2 res2 := divisionIntRecover(a2, b2) fmt.Println("res2",res2) } //import "fmt" func divisionIntRecover(a int, b int) (ret int) { // 先註釋掉 defer 進程終止拋出異常 //defer func() { // if err := recover(); err != nil { // // 打印異常,關閉資源,退出此函數 // fmt.Println(err) // ret = -3 // } //}() return a / b }
結果web
$ go run test.go panic: runtime error: integer divide by zero #錯誤 goroutine 1 [running]: main.divisionIntRecover(...) D:/web/golang/test.go:30 #錯誤具體行數 main.main() D:/web/golang/test.go:10 +0x12 exit status 2
這樣的終止會致使服務中止,咱們下面引入在defer中經過recover捕獲異常ide
package main import ( "fmt" ) // 舉例除數爲0 func main() { var a1 int = 2 var b1 int = 0 // 嚴重錯誤,處理爲-3 res1 := divisionIntRecover(a1, b1) fmt.Println("res1",res1) // 繼續運行 var a2 int = 2 var b2 int = 2 res2 := divisionIntRecover(a2, b2) fmt.Println("res2",res2) } //import "fmt" func divisionIntRecover(a int, b int) (ret int) { // 打開註釋,若是出現嚴重錯誤 正常處理 返回-3 defer func() { if err := recover(); err != nil { // 打印異常,關閉資源,退出此函數 fmt.Println(err) ret = -3 } }() return a / b }
結果函數
$ go run test.go runtime error: integer divide by zero res1 -3 res2 1
咱們舉例是 「除數爲0」
好比還有其餘狀況指針
- 空指針引用
- 下標越界
- 除數爲0
- 不該該出現的分支,好比default
- 輸入不該該引發函數錯誤