博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【更多流程控制】3. Go语言异常处理——panic
阅读量:6286 次
发布时间:2019-06-22

本文共 1187 字,大约阅读时间需要 3 分钟。

hot3.png

Go语言异常处理——panic

    在上一节,我们已经了解到了足够多的error接口及其周边的知识。现在,是学习另外一种异常处理方式的时候了。先来展示一个名词——panicpanic可被意译为运行时恐慌。因为它只有在程序运行的时候才会被“抛出来”。并且,恐慌是会被扩散的。当有运行时恐慌发生时,它会被迅速地向调用栈的上层传递。如果我们不显式地处理它的话,程序的运行瞬间就会被终止。这里有一个专有名词——程序崩溃。内建函数panic可以让我们人为地产生一个运行时恐慌。不过,这种致命错误是可以被恢复的。在Go语言中,内建函数recover就可以做到这一点。

  
    实际上,内建函数panicrecover是天生的一对。前者用于产生运行时恐慌,而后者用于“恢复”它。不过要注意,recover函数必须要在defer语句中调用才有效。因为一旦有运行时恐慌发生,当前函数以及在调用栈上的所有代码都是失去对流程的控制权。只有defer语句携带的函数中的代码才可能在运行时恐慌迅速向调用栈上层蔓延时“拦截到”它。这里有一个可以起到此作用的defer语句的示例:

defer func() {    if p := recover(); p != nil {        fmt.Printf("Fatal error: %s\n", p)    }}()

    在这条defer语句中,我们调用了recover函数。该函数会返回一个interface{}类型的值。还记得吗?interface{}代表空接口。Go语言中的任何类型都是它的实现类型。我们把这个值赋给了变量p。如果p不为nil,那么就说明当前确有运行时恐慌发生。这时我们需根据情况做相应处理。注意,一旦defer语句中的recover函数调用被执行了,运行时恐慌就会被恢复,不论我们是否进行了后续处理。所以,我们一定不要只“拦截”不处理。

  
    我们下面来反观panic函数。该函数可接受一个interface{}类型的值作为其参数。也就是说,我们可以在调用panic函数的时候可以传入任何类型的值。不过,我建议大家在这里只传入error类型的值。这样它表达的语义才是精确的。更重要的是,当我们调用recover函数来“恢复”由于调用panic函数而引发的运行时恐慌的时候,得到的值正是调用后者时传给它的那个参数。因此,有这样一个约定是很有必要的。
  
    总之,运行时恐慌代表程序运行过程中的致命错误。我们只应该在必要的时候引发它。人为引发运行时恐慌的方式是调用panic函数。recover函数是我们常会用到的。因为在通常情况下,我们肯定不想因为运行时恐慌的意外发生而使程序崩溃。最后,在“恢复”运行时恐慌的时候,大家一定要注意处理措施的得当。

转载于:https://my.oschina.net/u/3683692/blog/3036509

你可能感兴趣的文章
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>