简单描述: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/ 版权全部,欢迎保留原文连接进行转载:)