recover
雖然沒有try catch機制,Go其實有一種類似的recover機制,功能弱了點,用法很簡單: (建議學習:go)
package main import "fmt" func main() { fmt.Printf("%d\n", cal(1, 2)) fmt.Printf("%d\n", cal(5, 2)) fmt.Printf("%d\n", cal(5, 0)) fmt.Printf("%d\n", cal(9, 2)) } func cal(a, b int) int { defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() return a / b }
首先,大家得理解defer的作用,簡單說defer就類似物件裡面的構析函數,在這個函數終止的時候會執行,即使是panic導致的終止。
所以,在cal函數裡面每次終止的時候都會檢查有沒有異常產生,如果產生了我們可以處理,比如說記錄日誌,這樣程式還可以繼續執行下去。
package main import ( "errors" "fmt" "math" ) func main() { _, err := IntFromInt64(math.MaxInt32 + 1) if err != nil { fmt.Println(err) } } func ConvertInt64ToInt(i64 int64) int { if math.MinInt32 <= i64 && i64 <= math.MaxInt32 { return int(i64) } panic("can't convert int64 to int") } func IntFromInt64(i64 int64) (i int, err error) {//这里 defer func() { if err2 := recover(); err2 != nil { i = 0//这里 err = errors.New("ttt")//这里 } }() i = ConvertInt64ToInt(i64) return i, nil }
主要想法:return之前利用defer修改回傳變數(事先確定為i和err)的值
以上是golang recover後怎麼回的詳細內容。更多資訊請關注PHP中文網其他相關文章!