Golang中panic与recover的区别
来源:脚本之家
时间:2022-12-29 16:48:49 192浏览 收藏
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Golang中panic与recover的区别》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下panic、recover,希望所有认真读完的童鞋们,都有实质性的提高。
在执行过程中发生了panic。那么panic以后的代码不会执行,转而执行panic的逻辑,再执行defer,执行到的defer要将started标记为true,同时将其defer结构体中的_panic指针指向当前的_panic,表示这个defer是由该panic触发的。再去执行defer链表,如果defer执行中还触发了panic,panic后的代码不载执行,将这个panic插入panic链头,同时将其作为当前panic。当遇到了与当前panic不符的defer,就找到该defer上的panic,将其标记为已终止,从defer链表中移除当前执行的defer。打印panic移除信息,从链表尾开始逐步输出
流程
panic执行defer的流程:
- 先标记
started=true,_panic=&panic
- 后释放
- 目的是为了终止之前发生的panic
异常信息的输出方式:
- 所有还在panic链表上的项会被输出
- 顺序与发生panic的顺序一致
// A _panic holds information about an active panic. // // A _panic value must only ever live on the stack. // // The argp and link fields are stack pointers, but don't need special // handling during stack growth: because they are pointer-typed and // _panic values only live on the stack, regular stack pointer // adjustment takes care of them. type _panic struct { // argp 存储当前要执行的defer的函数参数地址 argp unsafe.Pointer // pointer to arguments of deferred call run during panic; cannot move - known to liblink // arg panic函数自己的参数 arg interface{} // argument to panic // link,链到之前发生的panic link *_panic // link to earlier panic pc uintptr // where to return to in runtime if this panic is bypassed sp unsafe.Pointer // where to return to in runtime if this panic is bypassed // recovered 标识panic是否被恢复 recovered bool // whether this panic is over // aborted 标识panic是否被终止 aborted bool // the panic was aborted goexit bool }
关于recover
recover只执行一件事
- 将当前执行的panic的recovered字段置为true
在每个defer执行完以后panic处理流程都会检查当前panic是否被recover
- 如果当前panic已经被恢复,就会将它从panic链中移除
- 执行到的defer也会被移除,同时要保存_defer.sp和_defer.pc
利用_defer.sp和_defer.pc跳出当前panic的处理流程,通过栈指针判断,只执行当前函数中注册的defer函数
在发生recover的函数正常结束后才会进入到检测panic是否被恢复的流程
当recover的函数又发生panic时,goroutine会将该panic加入到链头,设置为当前panic,再去执行defer链表,发现当前defer是当前panic执行的,移除当前defer,继续执行下一个,直到发现不是当前panic执行的,在panic链上找到那个panic,输出异常信息
对于已经recover标记的panic在输出异常信息时会加上recovered标记
终于介绍完啦!小伙伴们,这篇关于《Golang中panic与recover的区别》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
-
394 收藏
-
339 收藏
-
446 收藏
-
257 收藏
-
485 收藏
-
202 收藏
-
199 收藏
-
145 收藏
-
168 收藏
-
165 收藏
-
473 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 尊敬的冰棍
- 这篇文章真是及时雨啊,太详细了,很好,mark,关注博主了!希望博主能多写Golang相关的文章。
- 2023-04-02 13:06:06
-
- 眯眯眼的热狗
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢博主分享技术文章!
- 2023-01-29 02:31:06
-
- 幽默的芹菜
- 这篇技术文章真是及时雨啊,太详细了,写的不错,已加入收藏夹了,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-01-07 01:07:47
-
- 狂野的枕头
- 这篇文章太及时了,好细啊,太给力了,收藏了,关注作者大大了!希望作者大大能多写Golang相关的文章。
- 2023-01-04 21:07:06