在 Go 语言 中,如果我们的函数或者程序出现了非常严重的问题,或者说我们的程序遇到了 panic 异常,此时我们的程序会终止运行。
但是,我们希望我们程序在发生错误后,我们能够做一些处理,保证程序可以继续运行,那么这时候,我们就需要使用异常恢复,即 recover。Golang 中的 recover 一般都是配套 defer 一起使用。

例:

defer func() {if r := recover(); r != nil {fmt.Println("Recovered in f", r)}
}()

panic和recover使用原则:

  1. defer 需要放在 panic 之前定义,另外 recover 只有在 defer 调用的函数中才有效。
  2. recover 处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。
  3. 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用

panic与recover的关系:
如果有 panic 但没有 recover,那么程序会宕机。如果有 panic 也有 recover,程序不会宕机,执行完对应的 defer 后,从宕机点退出当前函数后继续执行。虽然 panic/recover 能模拟其他语言的异常机制,但并不建议在编写普通函数时也经常性使用这种特性。在 panic 触发的 defer 函数内,可以继续调用 panic,进一步将错误外抛,直到程序整体崩溃。

案例1:

package main
import "fmt"
func main() {defer func() {if info := recover(); info != nil {fmt.Println("panic happened, Info =", info)} else {fmt.Println("normally exit")}}()panic("fatal error")fmt.Println("continue...")
}

案例2: recover 捕获异常

package main
import ("fmt""time"
)
func main() {f()fmt.Println("end")
}
func f() {defer func() {fmt.Println("defer start")if err := recover(); err != nil {fmt.Println(err)}fmt.Println("defer end")}()for {fmt.Println("func begin")a := []string{"a", "b"}fmt.Println(a[3])fmt.Println("func end")time.Sleep(1 * time.Second)}
}


案例3 : 在defer中继续抛出错误

package main
import ("fmt""time"
)
func main() {f()fmt.Println("end")
}
func f() {defer func() {fmt.Println("defer2 start")if err := recover(); err != nil {fmt.Println(err)}fmt.Println("defer2 end")}()defer func() {fmt.Println("defer1 start")if err := recover(); err != nil {panic(err)}fmt.Println("defer1 end")}()for {fmt.Println("func begin")a := []string{"a", "b"}fmt.Println(a[3])fmt.Println("func end")time.Sleep(1 * time.Second)}
}

Go语言recover相关推荐

  1. c语言recover函数的功能是,c语言实验报告(附答案版).doc

    c语言实验报告(附答案版) 实验 一.实验学时二.实验目的1. (2)掌握不同的类型数据之间赋值的规律: (3)掌握数据在内存中的存储方式: (4)学会输入.输出函数的基本格式和使用方法: (5)学会 ...

  2. go语言 recover

    就是try package mainimport "fmt"func demo(i int) {//错误拦截到出现在错误之前defer func() {err := recover ...

  3. amis eureka_如何构建量身定制的amis来升级您的基础架构

    amis eureka There comes a time in everyone's infrastructure journey that you have to build your own ...

  4. 前端工程师 后段工程师_如何像工程师一样思考

    前端工程师 后段工程师 In my time in the tech field, I have learned that it really doesn't matter what tools or ...

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

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

  6. Go语言系列——31-自定义错误、32-panic和recover、33-函数是一等公民(头等函数)、34-反射、35-读取文件、36-写入文件

    文章目录 31-自定义错误 使用 New 函数创建自定义错误 使用 Errorf 给错误添加更多信息 使用结构体类型和字段提供错误的更多信息 使用结构体类型的方法来提供错误的更多信息 32-panic ...

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

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

  8. GO语言之recover

        运行panic异常一旦被引发就会导致程序崩溃,这当然不是我们愿意看到的,go语言提供乐专用于"拦截"运行时panic的内建函数-recover,它可以是当前的程序从运行时p ...

  9. 贝壳一键还原2.0(BeiKel One Key Recover 2.0)多语言版下载(简体中文,繁体中文,英文)

    贝壳一键还原2.0(BeiKel One Key Recover 2.0)多语言版提供下载. 程序启动后可以选择语言,默认是简体中文 下载地址:http://u.115.com/file/f3f5a6 ...

最新文章

  1. Android中网络使用
  2. 批量启动关闭MS SQL 2005服务BAT
  3. Feature Pyramid Networks for Object Detection 总结
  4. php如何给数组取名,给表单取名可以为数组,并且可以通过php打印出来
  5. 内存泄露从入门到精通三部曲之排查方法篇
  6. 《Servlet学习笔记》Servlet开发细节-线程安全
  7. 力扣836.矩形重叠
  8. MyEclipse 10的使用技巧
  9. 【SpringMVC笔记】拦截器 + 文件上传下载
  10. 好消息,MaxtoCode 1.10 已经封包,待2005.5.5日发布(如果有Bug将在1.20改正)
  11. Linux下安装和配置JDK与Tomcat(升级版)
  12. 这 173 家牛逼的互联网国企!值得你加入
  13. sketch插件的学习 末尾链接有彩蛋
  14. j2cache多级缓存
  15. ijkplayer 代码走读之 播放器网络数据读取过程详解2
  16. hive建表(一)创建外部表
  17. 初入Java,安装jdk,ij编译,运行
  18. 【转】ASP六大对象介绍
  19. 小小的面试二分题目,竟然暗藏玄机?
  20. 连接Linux服务器下Oracle数据库提示:ORA-12541: TNS: 无监听程序

热门文章

  1. vscode新建文件夹
  2. react + ant design 实现动态合并Table表格(相同数据合并为一条)
  3. 怎么抠图最简单?教你一行Python代码去除照片背景
  4. 软件开发工作量及费用量化评估方法在金融行业的应用
  5. PHP快手直播弹幕采集,获取斗鱼弹幕php版(原创)
  6. matlab 中克罗内克积,克罗内克积
  7. 1.C语言变量类型、全局变量、局部变量
  8. 软考笔记——第七章--数据结构
  9. C++——NOIP模拟题——零件加工
  10. 汽车管理软件批发,汽车管理软件哪个靠谱?