go 速学 - 10 - defer 与异常处理
2015-04-06 13:26
309 查看
目录
defer 与异常处理
概述
defer
定义多个 defer
改变返回值
panic 与 recover
使用 panic
使用 recover
摘要
defer,defer 栈,改变返回值,panic,recover
多个
即使函数发生严重错误也会执行
通过与匿名函数配合可以在 return 之后修改结果
错误的用法
正确的用法
输出
输出
注意
defer 与异常处理
概述
defer
定义多个 defer
改变返回值
panic 与 recover
使用 panic
使用 recover
摘要
defer,defer 栈,改变返回值,panic,recover
defer 与异常处理
概述
Go 没有try..catch这种异常机制,而是使用
panic和
recover。
panic在任何地方都可以执行,
recover只有在
defer调用的函数中才有效。
defer
defer用于定义在函数执行结束后执行的语句
多个
defer会形成
defer 栈,后定义的
defer语句会被最先调用
即使函数发生严重错误也会执行
通过与匿名函数配合可以在 return 之后修改结果
定义多个 defer
func testDefer() { fmt.Println("a") defer fmt.Println("b") defer fmt.Println("c") defer func() { fmt.Println("d") }() } testDefer() //a d c b
改变返回值
由于 defer 在函数执行结束后执行,所以可以用于改变命名返回值的值错误的用法
func changeResult(x int) int { defer func() { x++ //返回的值,改变变量没有用 }() return x } x = changeResult(8) fmt.Println("x", x) //x 8
正确的用法
func changeResult2(x int) (result int) { defer func() { result++ }() return x } x = changeResult2(8) fmt.Println("x", x) //x 9
panic 与 recover
panic用于向上传递异常,执行在
defer之后,表示非常严重不可恢复的异常,会导致程序挂掉
recover可以对
panic进行捕获,使
panic停止向上传递
使用 panic
func one() { fmt.Println("func one") } func two() { fmt.Println("func two") } func broken() { one() panic("func broken with Panic") two() } broken()
输出
func one panic: func broken with Panic 异常消息...程序中断
使用 recover
func one() { fmt.Println("func one") } func two() { fmt.Println("func two") } func catch() { one() defer func() { if err := recover(); err != nil { fmt.Println("func catch with Recover") } }() panic("func broken with Panic") two() } catch()
输出
func one func catch with Recover
注意
defer需要放在
panic之前定义
recover之后,逻辑并不会恢复到
panic那个点去,函数还是会在
defer之后返回
相关文章推荐
- Go的异常处理 defer, panic, recover<转载>
- Go的异常处理 defer, panic, recover
- go语言中的defer、panic、recover处理异常
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover<转载>
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover<转载>
- Go的异常处理 defer, panic, recover
- Go编程基础—defer、panic、recover处理异常
- Go的异常处理 defer, panic, recover
- go语言中的defer、panic、recover处理异常
- Go的异常处理 defer, panic, recover
- Go的异常处理 defer, panic, recover
- 10-17C#语句(3)--跳转语句、异常处理语句
- Java 编程中关于异常处理的 10 个最佳实践
- Java 编程中关于异常处理的 10 个最佳实践
- golang学习的点点滴滴:异常处理 defer, panic, recover
- SpringMVC学习系列(10) 之 异常处理
- 10 javaScript的异常处理 try{ }catch(theException){ }
- 10.多线程学习--处理线程组内的不受控制异常