GO语言-panic和recover
前言
go语言追求简洁,所以go语言中没有try...catch语句。因为go语言的作者认为将异常和控制语句混在一起,很容易让这个程序变得混乱,异常也很容易被滥用。
所以在go语言中,为了防止异常被滥用。我们常常使用函数的返回值来返回错误,而不是用异常来代替错误。
如果在一些场景下确实需要处理异常,就可以使用panic和recover。panic用来抛出异常,recover用来恢复异常。
panic
panic触发流程:
- 如果函数F中书写并触发了panic语句,会终止其后要执行的代码。在panic所在函数F内如果存在要执行的defer函数列表,则按照defer书写顺序的逆序执行;
- 如果函数G调用函数F,则函数F panic后返回调用者函数G。函数G中,调用函数F语句之后的语句都不会执行。假如函数G中也有要执行的defer函数列表,则按照defer书写顺序的逆序子还行;
- 退出整个goroutine,并报告错误。
func main() {defer fmt.Println("main---1---")defer fmt.Println("main---2---")fmt.Println("main---3---")mytest(1)defer fmt.Println("main---4---")fmt.Println("main---5---")
}func mytest(num int) {defer fmt.Println("mytest---1---")defer fmt.Println("mytest---2---")fmt.Println("mytest---3---")if num == 1 {panic("出现异常,抛出panic")}defer fmt.Println("mytest---4---")fmt.Println("mytest---5---")
}
代码执行流程:
从main函数进入 --> 遇到main函数中的2条defer语句 --> 打印"main---3---" --> 进入mytest函数
--> 遇到mytest函数中2条defer语句 --> 打印"mytest---3---" --> if语句为true触发panic --> 逆序执行mytest函数中的panic前的2条defer语句 --> 返回外部函数(main函数) --> 逆序执行main函数中的mytest函数前的2条defer语句 --> 抛出异常
由于panic抛出异常,可以看到mytest函数panic语句后面的语句都不被执行;返回外部函数后,mytest函数后的语句也都不被执行。
recover
- recover的作用是捕获panic,从而恢复正常代码执行;
- recover必须配合defer使用;
- recover没有传入参数,但是有返回值,返回值就是panic传递的值
recover示例
defer func() {if msg := recover(); msg != nil {fmt.Println("panic信息:", msg, "---recover恢复---")}}()
panic示例中的示例,如果在mytest中加入recover将panic恢复后,执行效果和顺序是如何的呢?
func main() {defer fmt.Println("main---1---")defer fmt.Println("main---2---")fmt.Println("main---3---")mytest(1)defer fmt.Println("main---4---")fmt.Println("main---5---")
}func mytest(num int) {defer func() {if msg := recover(); msg != nil {fmt.Println("panic信息:", msg, "---recover恢复---")}}()defer fmt.Println("mytest---1---")defer fmt.Println("mytest---2---")fmt.Println("mytest---3---")if num == 1 {panic("出现异常,抛出panic")}defer fmt.Println("mytest---4---")fmt.Println("mytest---5---")
}
代码执行流程:
从main函数进入 --> 遇到main函数中的2条defer语句 --> 打印"main---3---" --> 进入mytest函数
--> 遇到mytest函数中3条defer语句 --> 打印"mytest---3---" --> if语句为true触发panic --> 逆序执行mytest函数中的panic前的3条defer语句 --> 执行到第三条defer时,recover恢复恐慌并输出信息 --> 返回外部函数(main函数) --> 遇到mytest函数后的1条defer语句 --> 打印"mytest---5---" --> 逆序执行main函数中的3条defer语句
由于recover恢复恐慌,所以程序就不会因为panic而退出执行,所以mytest返回外部函数后,外部函数还能够正常执行下去。
GO语言-panic和recover相关推荐
- recover 没有捕获异常_GO语言异常处理机制panic和recover分析
本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...
- Go 语言踩坑记——panic 与 recover
题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...
- Go 语言编程 — panic 和 recover
目录 文章目录 目录 defer,panic 和 recover panic recover 通过 panic + recover 来简化错误处理 defer,panic 和 recover Gola ...
- Go语言中使用panic和recover简化错误处理
随着使用golang越来越频繁,发现golang有一个地方非常不方便,就是在错误处理方面.先来看看golang中通常的错误处理方法: 通常的error处理 1 2 3 4 5 6 7 8 9 10 1 ...
- Go语言之panic和recover
写在前面的话: panic是Go语言中,用于终止程序的一种函数,往往用在下面两种情况:1)程序出现了很大的故障,例如不能在提供服务了.2)程序在运行阶段碰到了内存异常的操作,例如空指针的取值,改写只读 ...
- Go 学习笔记(19)— 函数(05)[如何触发 panic、触发 panic 延迟执行、panic 和 recover 的关系]
1. 异常设计思想 Go 语言的错误处理思想及设计包含以下特征: 一个可能造成错误的函数,需要返回值中返回一个错误接口( error ),如果调用是成功的,错误接口将返回 nil ,否则返回错误. 在 ...
- golang panic和recover
panic和recover 文章目录 panic和recover panic panic之后又panic recover recover后同一函数又panic recover后恢复到哪里 recove ...
- Golang的Panic和Recover
什么是 panic? 在 Go 语言中,程序中一般是使用错误来处理异常情况.对于程序中出现的大部分异常情况,错误就已经够用了. 但在有些情况,当程序发生异常时,无法继续运行.在这种情况下,我们会使用 ...
- Golang中panic与recover的实现原理
今天我们讲讲golang中panic异常,以及recover对异常的捕获,由于panic.recover.defer之间非常亲密,所以今天就放在一起讲解,这里会涉及到一些defer的知识,有兴趣可以看 ...
- Go-关键字defer、panic、recover详解
目录 defer 调用时机 多次调用时的执行顺序 传参问题 源代码 panic 执行defer 跨协程问题 源代码 recover 使用 源代码 总结 defer panic recover 全部源代 ...
最新文章
- UnsatisfiedLinkError解决办法
- php随机不相同整数,生成固定范围不重复随机整数(JSPHP)
- 【渝粤题库】国家开放大学2021春2072人文社会科学基础(A)答案
- v140平台工具集与v110工具集选择
- ubuntu下打开.chm文件的方法(比如交换机参考手册)
- 单片机外文参考文献期刊_单片机-英文参考文献
- 真实面试经历:十面阿里,七面头条,六个Offer
- android4.4 计算器,卡西欧仿真计算器
- 差异表达基因变化倍数_重磅推出!欧易关键基因筛选报告
- word文件怎么压缩?
- win10电脑进入睡眠时间过快,电源选项的设置无效
- Bumped!详解—(Dijkstra堆优化,优先队列实现,结构体重载运算符)
- OA流程审批系统,即刻告别纸质化办公
- Python爬虫-bug处理办法(持续更新)
- KMS激活错误解决方法
- 小写数字转大写 一二三...
- XTU oj 1309唯一的子串
- QQ 访问聊天记录受限
- 经纬度计算---已知一点经纬度和距离,计算其他任意点经纬度
- 连续创造OTT赛道新神话,论酷开科技的持久力
热门文章
- MAC的delete键与Windows的对应关系
- 突破SBO屏蔽限制,自由实现快捷键自定义
- Xbox One Dance Central Spotlight 歌曲列表
- 浏览器主页被篡改解决方法
- 昆明理工大学计算机考研资料汇总
- 矩阵最简行阶梯型计算器_商人懂技术,谁也挡不住——首位将机械计算器推向全世界的人...
- 常用计算机杀毒软件名称,最常用的杀毒软件有哪些
- web服务器硬件软件配置选择
- python多元逻辑回归_Python机器学习的练习四:多元逻辑回归
- Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Connections could not b