golang学习笔记之panic recover
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相关推荐
- golang学习笔记(基础篇)
LCY~~Golang学习笔记 一.Go语言开发环境 ##安装Go开发包以及VsCode Go开发包与vscode配置安装教程网址:https://www.liwenzhou.com/posts/Go ...
- 118云原生编程语言Golang学习笔记
Golang学习笔记 文章目录 1.Go简介 1.1 简介 1.2 设计初衷 1.3 Golang vs Java 1.4 应用领域 1.5 用go语言的公司 2.Go下载和安装 2.1 开发工具 2 ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架 https://beego.me/docs/mvc/contr ...
- golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题
golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...
- golang学习笔记(五):数组的定义和使用
golang 学习笔记 数组定义 数组是一系列相同数据类型在内存中有序存储的数据集合 var 数组名 [元素个数]数据类型//定义了10个整型变量的数组元素var arr [10]int//通过下标找 ...
- golang学习笔记(十六):多态的实现
golang 学习笔记 多态实现 package main import "fmt"//先定义接口 在根据接口实现功能 type Humaner1 interface {//方法 ...
- golang学习笔记-1
golang学习笔记-1 自学golang时,找到一篇学习资料http://golang.iswbm.com/en/latest/c01/c01_08.html 初看上面两种写法,不明就里,哪里高级了 ...
- Golang学习笔记之GORM基础使用(二)
本文章主要学习GORM的增删查改.若还没有完成数据库和数据表的创建.定义模型以及数据库的连接请先学习本本专栏文章Golang学习笔记之GORM基础使用(一).本文为学习笔记,通过GORM官方中文文档和 ...
- golang学习笔记之--Go语言内建容器
话接上文 <golang学习笔记之--Go语言基本语法> 今天继续记录学习笔记,今天的笔记主题是Go语言内建容器 如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复&qu ...
最新文章
- 学习Angular前了解下TypeScript
- Python处理JSON数据
- android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
- 自定义ListView中的分割线
- 美国人用什么android手机,美国过半消费者使用智能手机 Android占48.5%
- iBATIS框架源码剖析
- c4d序列号_(图文+视频)野分享:手把手教你免费获取Megascans所有资产并应用于C4D...
- odoo13 订单模板设置_ERP输出嵌入公章的采购订单电子档,其实真的不难
- 星岚技术 Win7 x64 纯净版 V2021.4【带驱动包】
- kaggle数据集下载
- 知识点滴 - 什么是彩票
- Python3-word文档操作(七):提取word文档中的图片方式一-利用word文档的压缩文件属性
- 自制hdmi线一头改vga图_什么是VGA?
- C语言即是素数又是回文数,急!(C语言)从给出的数据中找出既是回文数又是素数的数……...
- 经纬度坐标转换成屏幕坐标
- Word中插入PDF
- 数字媒体技术专业方向
- HUD1.2.4 Nasty Hacks
- 其它 以字典的方式 暴力破解 压缩文件密码
- python cv2什么意思_这次一定要记住opencv和cv2是什么及其基础用法
热门文章
- java 集合notifyall,java.lang.Object.notifyAll()方法实例
- android glsurface 闪屏,在null对象引用上的android.opengl.GLSurfaceView $GLThread.surfaceCreated()’...
- OpenGL - Anti Aliasing
- 【原创】通过 ioctl + FIONREAD 判定数据可读
- XLM解读(论文 + PyTorch源码)
- Cannot resolve reference to bean ‘transactionManager‘ while setting bean property ‘transactionManage
- 【PAT】A1006 Sign In and Sign Out (25) (查找)
- 深度学习_深度学习基础_评价指标ROC、AUC、AP、mAP详解
- 函数练习220216
- Open62541取消日志的打印