golang异常捕获后,可以记录堆栈信息到日志,方便以后分析,同时异常捕获后,主程序可以继续运行;

  • recover初级用法

    示例代码如下:

    package mainimport ("fmt""runtime/debug""time"
    )func PanicTrace() {if err := recover(); err != nil {fmt.Println("panic:", err, ", stack:", string(debug.Stack()))}
    }func main() {go func() {defer PanicTrace() // 加入异常捕获var infoMap map[int]stringinfoMap[1] = "a" // 这里map未初始化直接调用导致协程异常}()time.Sleep(2 * time.Second)fmt.Println("Exit.") // 主协程依然可以正常执行
    }

    执行结果如下:

    panic: assignment to entry in nil map , stack: goroutine 5 [running]:
    runtime/debug.Stack(0xc04203de98, 0x4a4960, 0x4cfda0)C:/Go/src/runtime/debug/stack.go:24 +0xae
    main.PanicTrace()C:/antelop/gopath/src/test/main.go:11 +0x75
    panic(0x4a4960, 0x4cfda0)C:/Go/src/runtime/panic.go:502 +0x237
    main.main.func1()C:/antelop/gopath/src/test/main.go:20 +0x66
    created by main.mainC:/antelop/gopath/src/test/main.go:16 +0x3cExit.
    
  • recover进阶用法

上面的方法需要在每个协程函数的最开始位置添加“defer PanicTrace()”的调用,当协程比较多时,比较容易忘记调用该方法,下面对recover进行进一步封装:

package mainimport ("fmt""runtime/debug""time"
)// WithRecover将协程方法直接封装进来调用
func WithRecover(fn func()) {defer func() {if err := recover(); err != nil {fmt.Println("panic:", err, ", stack:", string(debug.Stack()))}
}()fn()
}func GoFunc() {var infoMap map[int]stringinfoMap[1] = "a" // 这里map未初始化直接调用导致协程异常
}func main() {// 协程方法调用进一步封装go WithRecover(GoFunc)time.Sleep(2 * time.Second)fmt.Println("Exit.")
}

golang学习笔记之panic recover相关推荐

  1. golang学习笔记(基础篇)

    LCY~~Golang学习笔记 一.Go语言开发环境 ##安装Go开发包以及VsCode Go开发包与vscode配置安装教程网址:https://www.liwenzhou.com/posts/Go ...

  2. 118云原生编程语言Golang学习笔记

    Golang学习笔记 文章目录 1.Go简介 1.1 简介 1.2 设计初衷 1.3 Golang vs Java 1.4 应用领域 1.5 用go语言的公司 2.Go下载和安装 2.1 开发工具 2 ...

  3. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架 https://beego.me/docs/mvc/contr ...

  4. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  5. golang学习笔记(五):数组的定义和使用

    golang 学习笔记 数组定义 数组是一系列相同数据类型在内存中有序存储的数据集合 var 数组名 [元素个数]数据类型//定义了10个整型变量的数组元素var arr [10]int//通过下标找 ...

  6. golang学习笔记(十六):多态的实现

    golang 学习笔记 多态实现 package main import "fmt"//先定义接口 在根据接口实现功能 type Humaner1 interface {//方法 ...

  7. golang学习笔记-1

    golang学习笔记-1 自学golang时,找到一篇学习资料http://golang.iswbm.com/en/latest/c01/c01_08.html 初看上面两种写法,不明就里,哪里高级了 ...

  8. Golang学习笔记之GORM基础使用(二)

    本文章主要学习GORM的增删查改.若还没有完成数据库和数据表的创建.定义模型以及数据库的连接请先学习本本专栏文章Golang学习笔记之GORM基础使用(一).本文为学习笔记,通过GORM官方中文文档和 ...

  9. golang学习笔记之--Go语言内建容器

    话接上文 <golang学习笔记之--Go语言基本语法> 今天继续记录学习笔记,今天的笔记主题是Go语言内建容器 如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复&qu ...

最新文章

  1. 学习Angular前了解下TypeScript
  2. Python处理JSON数据
  3. android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
  4. 自定义ListView中的分割线
  5. 美国人用什么android手机,美国过半消费者使用智能手机 Android占48.5%
  6. iBATIS框架源码剖析
  7. c4d序列号_(图文+视频)野分享:手把手教你免费获取Megascans所有资产并应用于C4D...
  8. odoo13 订单模板设置_ERP输出嵌入公章的采购订单电子档,其实真的不难
  9. 星岚技术 Win7 x64 纯净版 V2021.4【带驱动包】
  10. kaggle数据集下载
  11. 知识点滴 - 什么是彩票
  12. Python3-word文档操作(七):提取word文档中的图片方式一-利用word文档的压缩文件属性
  13. 自制hdmi线一头改vga图_什么是VGA?
  14. C语言即是素数又是回文数,急!(C语言)从给出的数据中找出既是回文数又是素数的数……...
  15. 经纬度坐标转换成屏幕坐标
  16. Word中插入PDF
  17. 数字媒体技术专业方向
  18. HUD1.2.4 Nasty Hacks
  19. 其它 以字典的方式 暴力破解 压缩文件密码
  20. python cv2什么意思_这次一定要记住opencv和cv2是什么及其基础用法

热门文章

  1. java 集合notifyall,java.lang.Object.notifyAll()方法实例
  2. android glsurface 闪屏,在null对象引用上的android.opengl.GLSurfaceView $GLThread.surfaceCreated()’...
  3. OpenGL - Anti Aliasing
  4. 【原创】通过 ioctl + FIONREAD 判定数据可读
  5. XLM解读(论文 + PyTorch源码)
  6. Cannot resolve reference to bean ‘transactionManager‘ while setting bean property ‘transactionManage
  7. 【PAT】A1006 Sign In and Sign Out (25) (查找)
  8. 深度学习_深度学习基础_评价指标ROC、AUC、AP、mAP详解
  9. 函数练习220216
  10. Open62541取消日志的打印