异常处理

Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误。

异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

panic

  1. 内置函数
  2. 假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行
  3. 返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行
  4. 直到goroutine整个退出,并报告错误

recover

  1. 内置函数
  2. 用来控制一个goroutine的panicking行为,捕获panic,从而影响应用的行为
  3. 一般的调用建议
    a). 在defer函数中,通过recever来终止一个goroutine的panicking过程,从而恢复正常代码的执行
    b). 可以获取通过panic传递的error

使用

1.利用recover处理panic指令,defer 必须放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。否则当panic时,recover无法捕获到panic,无法防止panic扩散。
2.recover 处理异常后,逻辑并不会恢复到 panic 那个点去
3.多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用。

func main() {test()
}func test() {defer func() {if err := recover(); err != nil {println(err.(string)) // 将 interface{} 转型为具体类型。}}()panic("panic error!")
}
-------------------------------------panic error!

延迟调用中引发的错误,可被后续延迟调用捕获,但仅最后一个错误可被捕获。

func test() {defer func() {fmt.Println(recover())}()defer func() {panic("defer panic")}()panic("test panic")
}func main() {test()
}
---------------------------------
defer panic

实例

捕获函数 recover 只有在延迟调用内直接调用才会终止错误,否则总是返回 nil。任何未捕获的错误都会沿调用堆栈向外传递。

func test() {defer func() {fmt.Println(recover()) //有效 打印正确异常}()defer recover()              //无效!defer fmt.Println(recover()) //无效! 打印nildefer func() {func() {println("defer inner") // 打印defer innerrecover() //无效!}()}()panic("test panic")
}func main() {test()
}
-------------------------------------
defer inner
<nil>
test panic

如何区别使用 panic 和 error 两种方式

惯例是:导致关键流程出现不可修复性错误的使用 panic,其他使用 error。

go 异常捕获和处理(panic/recover)相关推荐

  1. go 异常捕获处理 panic defer recover

    简言 在其他语言里,宕机往往以异常的形式存在,底层抛出异常,上层逻辑通过 try/catch 机制捕获异常,没有被捕获的严重异常会导致宕机 go语言追求简洁,优雅,Go语言不支持传统的 try-cat ...

  2. Go 异常捕获处理: panic(err) 与 recover()

    代码实例 func (rcvr *CQL) Compile(ctx context.Context) string {defer func() {if err := recover(); err != ...

  3. 简单介绍Go语言错误处理异常捕获+异常抛出

    这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运 ...

  4. Go: panic / recover 简介与实践

    文章目录 简介 1.特性 2.panic触发流程 3.recover使用要点 4.使用场景 一.实践 1.跨线程失效 2.不起作用的recover 3.嵌套使用panic 4.注意事项 小结 简介 g ...

  5. go中宕机与恢复 panic/recover 介绍

    目录 一.panic 宕机 二.recover恢复 三.panic和recover的关系 Go 语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失.Go 语言程 ...

  6. go defer,panic,recover详解 go 的异常处理

    golang中defer,panic,recover是很常用的三个特性,三者一起使用可以充当其他语言中try-catch-的角色,而defer本身又像其他语言的析构函数 defer defer后边会接 ...

  7. golang学习笔记之panic recover

    golang异常捕获后,可以记录堆栈信息到日志,方便以后分析,同时异常捕获后,主程序可以继续运行: recover初级用法 示例代码如下: package mainimport ("fmt& ...

  8. Intel Realsense D435 当摄像头运行过程中突然USB线断开,对RuntimeError: Frame didn't arrived within 5000的异常捕获及处理

    如图,在摄像头运行过程中,摄像头突然断开,可能设备需要对异常进行捕获并处理(如摄像头重连,发出警报,发送信号给车辆让它停止前进等) 需阅读,python异常捕获及处理 191225 通过捕获所有异常, ...

  9. Go案例说明defer panic recover

    defer推迟  recover恢复  panic恐慌 通过一个案例解释:发送邮件的 发送不成功要修改数据表的邮件发送状态值 发送邮件的内部sendEmail出现错误  要去修改数据表的状态值了 发送 ...

最新文章

  1. vim 多窗口启动以及相互切换
  2. 收藏的2个正则html标签剔除方法
  3. stl algorithm清单
  4. 现代计算机网络发展为第几代,晶体管计算机是第几代_个人计算机使用的电子元器件_计算机网络最突出的(6)...
  5. linux密码特殊字符识别
  6. IDEA中安装TeaVM插件
  7. 最新可用快手极速版自动阅读薅羊毛autojs脚本
  8. 云计算中网络基础知识
  9. Python基于OpenCV的工作疲劳检测系统[源码&UI界面&部署教程]
  10. Android 文件选择/文件管理
  11. MapGIS完美转ArcGIS ShapeFile攻略
  12. 如何在Ubuntu 20.04上设置和配置证书颁发机构(CA)
  13. 解读谷歌财报:17亿美元罚款致利润缩减,流量成本激增已迎来下行拐点
  14. 如何选择适合你的兴趣爱好(一),拉丁舞
  15. 《古剑奇谭WEB》值得期待的三大理由
  16. 三十五、影院页面(获取卖座官网的影院信息并显示)
  17. Ros智能小车麦克纳姆轮、橡胶轮的加紧固办法、轮子紧固不脱离
  18. spynet(一):光流估计代码介绍
  19. CloudCompare编译las
  20. 大工13秋《专业英语(计算机英语)》在线测试3,大工18春《专业英语(计算机英语)》在线测试3【参考答案】...

热门文章

  1. 神经网络的图谱是什么,图神经网络和神经网络
  2. 【20220207】【信号处理】希尔伯特变换定义及解调原理
  3. 瑞利信号公式(级联信道,多信道之和,多个瑞利信号之和,概率密度函数)
  4. 恒生电子面试过程纪录
  5. python文件查重_文件查重 我使用的是面向局部敏感的最小哈希签名的方法进行文档查重 联合开发网 - pudn.com...
  6. 什么是NAT模式、路由模式
  7. linux怎么添加拼音输入法,ubuntu如何安装中文输入法
  8. Leetcode_206_Reverse Linked List
  9. Linux下安装bugzilla
  10. 对于说人话的人的置疑