文章目录

  • go panic 与 recover
    • panic
    • recover
    • go 中异常处理模板

go panic 与 recover

go 不像python一样,有 try-except语法,同样也不推荐异常捕获的方式,而是直接将异常返回的方式,并且直接退出也会比层层返回方便的多。因此go中实现了 panic- recover 机制。专门用于对这些异常进行抛出和恢复。但是 在 go 中更推荐使用 错误类型,而不是 使用 panic 和 recover。只有当程序不能继续运行时,才应该使用panic-recover机制。

panic

panic 用于主动抛异常,类似于python 中的 raise

panic 有两个合理的用例。

  1. 发生了一个不能恢复的错误,此时程序不能继续运行。一个例子就是 web 服务器无法绑定所要求的端口。在这种情况下,就应该使用 panic,因为如果不能绑定端口,啥也做不了。

  2. 发生了一个编程上的错误。 假如我们有一个接收指针参数的方法,而其他人使用 nil 作为参数调用了它。在这种情况下,我们可以使用 panic,因为这是一个编程错误:用 nil 参数调用了一个只能接收合法指针的方法。

示例

func main() {fmt.Println("我开始了")panic("我出错了")fmt.Println("我结束了")
}

recover

recover 用于恢复程序运行,但是recover的正确使用有 2 点需要注意

  1. recover 必须配合defer 使用
  2. recover 必须是要在defer 闭包或者调用函数下的第一层使用

示例

func main() {fmt.Println("我开始了")// recover()  // 执行时还没报错,所以无效defer func() {     //  正确使用1recover()}()// defer Test4()  // 正确使用2panic("我出错了")// recover()  // 报错后执行不到这里,所以无效fmt.Println("我结束了")
}func Test4()  {recover()
}

需要注意的是,recover 能恢复程序的运行,但是 这一层 的后续代码是不会执行的。会直接跳过该函数或方法,执行其他的代码

func main() {f1()f2()f3()
}func Test4()  {recover()
}func f1()  {fmt.Println("我是f1")
}
func f2()  {defer Test4()  // 正确使用2panic("f2报错了")fmt.Println("我是f2")
}
func f3()  {fmt.Println("我是f3")
}

go 中异常处理模板

对比 python 中的 try-except-finallly,在go中也可以利用 recover + defer + if 判断的方式实现,代码如下:

defer func() {if err := recover(); err != nil {  // err 有值说明有错误fmt.Println(err)   // 打印错误类型, python中 except 中的代码}fmt.Println("python中finally的代码")
}

将这段代码,放在可能要出错的代码上方即可,当然你也可以写成上述正确使用2,来使用。

go panic 与 recover相关推荐

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

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

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

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

  3. go的异常处理,defer,panic,recover

    比较经典的一个例子,里面包含defer,panic,recover 例子代码: package main import "fmt" func main(){ defer func( ...

  4. Golang中的panic和recover(捕获异常)

    Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...

  5. Go 语言编程 — panic 和 recover

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

  6. golang中的panic和recover

    golang中的panic需要recover捕获,不然程序就会挂掉 package mainimport "fmt"func main() {f1()fmt.Println(&qu ...

  7. 关键字之defer、panic、recover

    一.defer                1. defer延迟调用,完成一些收尾工作.无论函数或方法是否出错,一定会在退出当前函数或者方法之前调用传入的函数(只对函数或方法生效,代码块不生效),常 ...

  8. 异常处理机制——panic 和 recover

    Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错误,与 error 不同,panic-recover 一般用在函数内部.一定要注意不要滥用 pa ...

  9. Golang——error处理及panic、recover使用的正确姿势

    异常就是程序出现了不正常的情况,会导致程序非正常停止,而异常处理就是针对非正常停止的情况,给出异常时的处理方式.语法错误不算异常体系中 error: error是一个接口,作用是返回程序异常的信息,e ...

  10. 在golang中defer、panic与recover的作用

    package mainimport "fmt"func main() {var s strings = "panic"fmt.Printf("a的初 ...

最新文章

  1. 基于Qt的OpenGL可编程管线学习(9)- X射线
  2. 你得学会并且学得会的Socket编程基础知识
  3. linux支持中文文件名,CentOS安装中文支持(linux中文文件名乱码)
  4. 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串
  5. Ubuntu18.04创建新的系统用户
  6. 学生成绩管理系统实验报告_学习60天python成果,Python变成学生成绩管理系统
  7. 转:Socket编程知识必学
  8. 【并行计算-CUDA开发】 NVIDIA Jetson TX1
  9. iOS AVPlayer的那些坑
  10. C语言课设贪吃蛇说明书,c语言课设贪吃蛇.doc
  11. yum install gcc报错Error: Package: glibc-2.17-260.el7_6.6.i686 (updates) Requires: glibc-common = 2.17
  12. symbian 串行通信
  13. 大学老师必备!30余个学术资源网站速收藏(附链接)
  14. 浅谈机器学习之深度学习
  15. 保留原先小程序名称 更改微信小程序主体
  16. 最近遇到的异常与错误总结
  17. 【bzoj3875】[Ahoi2014Jsoi2014]骑士游戏
  18. nhibernate mysql配置_NHibernate 连接多数据库怎么配置?
  19. ios开发语言在c语言的基础上,iOS开发 - C语言基础4(基本语句和运算符) - 猫扑天空...
  20. C语言编程实现求解应力向量,基于MATLAB与Visual C 实现主应力的编程求解.doc

热门文章

  1. Linux capability详解
  2. 【软件架构文档之SOC篇】
  3. 7-15 新浪微博热门话题
  4. 个人税收计算器(只限长沙)全线仿照九米个税计算器
  5. python系列教程158——iter函数
  6. 戴个美瞳却患上了角膜炎和干眼症?
  7. Google Play Store上线流程
  8. 关于adsl上网的问题
  9. 百度地图 变黑问题 解决方法
  10. WISP Client+AP WDS  的区别