go语言中的defer、panic、recover处理异常
来源:互联网 发布:电脑是怎么储存数据的 编辑:程序博客网 时间:2024/06/03 01:42
go语言中的defer就像c++中的析构函数,但是go语言中defer的对象是函数(或者对象的方法),defer能保证在函数结束最后执行该方法(函数),但是有例外:如果在定义的方法中defer定义的方法如果在panic后面,defer定义的方法就无法执行到。
panic 是用来表示非常严重的不可恢复的错误的。在Go语言中这是一个内置函数,接收一个interface{}类型的值作为参数。panic 的作用就像我们平常接触的异常。不过Go可没有try…catch,所以,panic一般会导致程序挂掉(除非recover)。所以,Go语言中的异常,那真的是异常了。你可以试试,调用panic看看,程序立马挂掉,然后Go运行时会打印出调用栈。
但是,关键的一点是,即使函数执行的时候 panic了,函数不往下走了,运行时并不是立刻向上传递panic,而是到defer那,等defer的东西都跑完了,panic再向上传递。所以这时 候 defer 有点类似 try-catch-finally 中的 finally。
panic就是这么简单。抛出个真正意义上的异常。
panic的函数并不会立刻返回,而是先defer,再返回,如果有办法将panic捕获到,并阻止panic传递,就正常处理,如果没有没有捕获,程序直接异常终止(可以注释掉下面程序中的recover试一试)。
Go语言提供了recover内置函数,前面提到,一旦panic,逻辑就会走到defer那,那我们就在defer那等着,调用recover函数将会捕获到当前的panic(如果有的话),被捕获到的panic就不会向上传递了,于是,世界恢复了和平。你可以干你想干的事情了。
不过要注意的是,recover之后,逻辑并不会恢复到panic那个点去,函数还是会在defer之后返回。
请看下面的例子:
go recover.go
package mainimport "fmt"func main() { fmt.Printf("hello world my name is %s, I'm %d\r\n", "songxingzhu", 26) recoverTest() fmt.Printf("这里能执行到!")}func recoverTest() { defer func() { if err := recover(); err != nil { fmt.Println("出了错:", err) } }() myPainc()}func myPainc() { var x = 30 var y = 0 //panic("我就是一个大错误!") var c = x / y fmt.Println(c)}
运行结果:
hello world my name is songxingzhu, I'm 26出了错: runtime error: integer divide by zero这里能执行到!
从以上结果可以看出,如果panic被recover捕获接收到,panic后的方法还是能继续执行的。
参考:
https://studygolang.com/articles/521
- 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 panic, defer, 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语言异常处理机制panic和recover分析
- GO语言异常处理机制panic和recover分析
- Volume-Docker存储(二)
- python_tkinter画布
- cmd修改mysql的root密码(忘记原密码时)
- Linux下一句话升级所有过期的python包
- 深入理解Java虚拟机(三)-----类文件结构和类加载机制
- go语言中的defer、panic、recover处理异常
- 1010 三角形与星号加强版
- (转载)mysql中文编码解决方法
- android wifi开发
- 23-临时对象
- 多key业务,数据库水平切分架构一次搞定
- Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程
- 防止网页被盗用 网页加密完全攻略
- springmvc基础