前言

go语言追求简洁,所以go语言中没有try...catch语句。因为go语言的作者认为将异常和控制语句混在一起,很容易让这个程序变得混乱,异常也很容易被滥用。

所以在go语言中,为了防止异常被滥用。我们常常使用函数的返回值来返回错误,而不是用异常来代替错误。

如果在一些场景下确实需要处理异常,就可以使用panic和recover。panic用来抛出异常,recover用来恢复异常。

panic

panic触发流程:

  1. 如果函数F中书写并触发了panic语句,会终止其后要执行的代码。在panic所在函数F内如果存在要执行的defer函数列表,则按照defer书写顺序的逆序执行;
  2. 如果函数G调用函数F,则函数F panic后返回调用者函数G。函数G中,调用函数F语句之后的语句都不会执行。假如函数G中也有要执行的defer函数列表,则按照defer书写顺序的逆序子还行;
  3. 退出整个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

  1. recover的作用是捕获panic,从而恢复正常代码执行;
  2. recover必须配合defer使用;
  3. 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相关推荐

  1. recover 没有捕获异常_GO语言异常处理机制panic和recover分析

    本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...

  2. Go 语言踩坑记——panic 与 recover

    题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...

  3. Go 语言编程 — panic 和 recover

    目录 文章目录 目录 defer,panic 和 recover panic recover 通过 panic + recover 来简化错误处理 defer,panic 和 recover Gola ...

  4. Go语言中使用panic和recover简化错误处理

    随着使用golang越来越频繁,发现golang有一个地方非常不方便,就是在错误处理方面.先来看看golang中通常的错误处理方法: 通常的error处理 1 2 3 4 5 6 7 8 9 10 1 ...

  5. Go语言之panic和recover

    写在前面的话: panic是Go语言中,用于终止程序的一种函数,往往用在下面两种情况:1)程序出现了很大的故障,例如不能在提供服务了.2)程序在运行阶段碰到了内存异常的操作,例如空指针的取值,改写只读 ...

  6. Go 学习笔记(19)— 函数(05)[如何触发 panic、触发 panic 延迟执行、panic 和 recover 的关系]

    1. 异常设计思想 Go 语言的错误处理思想及设计包含以下特征: 一个可能造成错误的函数,需要返回值中返回一个错误接口( error ),如果调用是成功的,错误接口将返回 nil ,否则返回错误. 在 ...

  7. golang panic和recover

    panic和recover 文章目录 panic和recover panic panic之后又panic recover recover后同一函数又panic recover后恢复到哪里 recove ...

  8. Golang的Panic和Recover

    什么是 panic? 在 Go 语言中,程序中一般是使用错误来处理异常情况.对于程序中出现的大部分异常情况,错误就已经够用了. 但在有些情况,当程序发生异常时,无法继续运行.在这种情况下,我们会使用  ...

  9. Golang中panic与recover的实现原理

    今天我们讲讲golang中panic异常,以及recover对异常的捕获,由于panic.recover.defer之间非常亲密,所以今天就放在一起讲解,这里会涉及到一些defer的知识,有兴趣可以看 ...

  10. Go-关键字defer、panic、recover详解

    目录 defer 调用时机 多次调用时的执行顺序 传参问题 源代码 panic 执行defer 跨协程问题 源代码 recover 使用 源代码 总结 defer panic recover 全部源代 ...

最新文章

  1. UnsatisfiedLinkError解决办法
  2. php随机不相同整数,生成固定范围不重复随机整数(JSPHP)
  3. 【渝粤题库】国家开放大学2021春2072人文社会科学基础(A)答案
  4. v140平台工具集与v110工具集选择
  5. ubuntu下打开.chm文件的方法(比如交换机参考手册)
  6. 单片机外文参考文献期刊_单片机-英文参考文献
  7. 真实面试经历:十面阿里,七面头条,六个Offer
  8. android4.4 计算器,卡西欧仿真计算器
  9. 差异表达基因变化倍数_重磅推出!欧易关键基因筛选报告
  10. word文件怎么压缩?
  11. win10电脑进入睡眠时间过快,电源选项的设置无效
  12. Bumped!详解—(Dijkstra堆优化,优先队列实现,结构体重载运算符)
  13. OA流程审批系统,即刻告别纸质化办公
  14. Python爬虫-bug处理办法(持续更新)
  15. KMS激活错误解决方法
  16. 小写数字转大写 一二三...
  17. XTU oj 1309唯一的子串
  18. QQ 访问聊天记录受限
  19. 经纬度计算---已知一点经纬度和距离,计算其他任意点经纬度
  20. 连续创造OTT赛道新神话,论酷开科技的持久力

热门文章

  1. MAC的delete键与Windows的对应关系
  2. 突破SBO屏蔽限制,自由实现快捷键自定义
  3. Xbox One Dance Central Spotlight 歌曲列表
  4. 浏览器主页被篡改解决方法
  5. 昆明理工大学计算机考研资料汇总
  6. 矩阵最简行阶梯型计算器_商人懂技术,谁也挡不住——首位将机械计算器推向全世界的人...
  7. 常用计算机杀毒软件名称,最常用的杀毒软件有哪些
  8. web服务器硬件软件配置选择
  9. python多元逻辑回归_Python机器学习的练习四:多元逻辑回归
  10. Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Connections could not b