簡單描述:Go中能夠拋出一個panic的異常,而後在defer中經過recover捕獲這個異常,而後正常處理。
例子代碼:html
package main import "fmt" func demo(){ fmt.Println("Welcome, my name is fudomine") panic(400) fmt.Println("Hello") } func main(){ defer func(){ fmt.Println("defer start") errorMsg := recover() fmt.Println("Error msg :", errorMsg) fmt.Println("defer end") }() demo() }
運行結果
git
defer 英文原意: vi. 推遲;延期;服從 vt. 使推遲;使延期。web
func demo()(str string){ str = "Hello" defer func() { str = "Welcome, my name is fudomine" }() return }
返回結果:Welcome, my name is fudomine編程
func demo()(str string){ str = "Hello" return defer func() { str = "Welcome, my name is fudomine" }() return }
返回結果:Hellodom
可能會有小夥伴本身編寫代碼後,答案不一致;爲此特貼出不同結果的例子代碼並進行分析;函數
func demo()(string){ str := "Hello" defer func() { str = "Welcome, my name is fudomine" }() return str }
緣由:defer 中return xxx這一條語句並非一條原子指令,而上面結果是由於初始化時候就聲明輸出類型是*T(指針);spa
拆分爲:設計
- 返回值 = xxx
- 調用defer函數
- 空的return
詳細請參考下《深刻解析GO》一文指針
panic 英文原意:n. 恐慌,驚慌;大恐慌 adj. 恐慌的;沒有理由的 vt. 使恐慌 vi. 十分驚慌code
recover 英文原意: vt. 恢復;彌補;從新得到 vi. 恢復;勝訴;從新得球 n. 還原至預備姿式
參考文獻
《go web編程》
做者:不動峯
博客園: http://www.cnblogs.com/mylly/ 版權全部,歡迎保留原文連接進行轉載:)