在go中,虽然协程很好用,但是需要注意捕获他的异常,不如在生产环境中,子协程panic了,你的整个服务都会挂掉
错误示例
package main import ( "fmt" "time" ) func main() { defer func() { r := recover() fmt.Println("recover r:",r) }() // 启动一个协程 go func() { panic("start panic") }() // block 一下主协程 time.Sleep(1 * time.Second) fmt.Println("done") }
正确用法
package main import ( "fmt" "time" ) func main() { defer func() { r := recover() fmt.Println("recover r:", r) }() // 启动一个协程 go func() { defer func() { r := recover() fmt.Println("recover goroutine r:", r) }() panic("start panic") }() // block 一下主协程 time.Sleep(1 * time.Second) fmt.Println("done") }
原创文章,作者:站长,如若转载,请注明出处:https://wsppx.cn/1839/%e7%bd%91%e7%bb%9c%e5%bc%80%e5%8f%91/

相关推荐
-
python后端开发面试-redis缓存
默认16个数据库 五中数据结构 string list(列表) set(集合) zset(有序列表) hash(字典) 理解穿透、击穿、雪崩及其处理方法 redis怎样实现分布式锁…
-
python后端开发面试-垃圾回收
python垃圾回收机制是以引用计数为主,标记清除,分代回收为辅。 引用计数 在cpython中,引用计数的数据结构是这样的 ob_refcnt是记录对象被引用的次数,如果值为0,…
-
前端面试题:Http code 301和 302区别
总结:301是永久跳转并且有缓存,而302是临时跳转,没有缓存。 使用场景:当迁移域名当时候,网站域名是永久性转移,这时可以用301; 而当只是在服务器内部跳转,比如访问服务器a….
-
构建自己的脚手架过程大致记录
脚手架就是在启动的时候询问一些简单的问题,并且通过用户回答的结果去渲染对应的模板文件。 工作流程: 1.根据命令行交互询问用户问题 2.根据用户回答的结果生成文件 脚手架的简单雏形…
-
docker教程系列之docker怎么构建镜像
在前面一章我们讲到了如何使用docker,这一章将会讲到如何把我们的项目打包成docker镜像,这种需求在我们的工作中很非常常见的,下面将会分别讲到dockerfile文件构成,后…
-
前端面试题—平安前端面试题
1.mixin混入,以后自身生命周期和混入周期的具体实现,mixin的具体实现 定义:分发vue中可复用的功能,本质是一个js对象,它可以包含我们组件中任意功能选项,如data、c…
-
k8s基本安装(一)
前言 win10 vm16 5台2c/2g/50G centos虚拟机 设计架构 网络设置 vm NAT网络设置 网段:10.4.7.0 网关:10.4.7.254 网络适配器设置…
-
前端面试题整理(持续收集,后期补充答案)
HTTP协议相关 HTTP建立连接之tcp三次握手 HTTP断开连接之tcp四次挥手 缓存:强缓存与协商缓存 网络七层协议 浏览器输入一个网址,到页面展示这中间经历了什么? HTT…
-
重学Python基础篇(一)之认识python
前言 在我刚毕业的时候Python语言就非常火了,随之而来的就是招人单位,python岗位的激增,但同时增加的还有培训单位,这也造成了市场的饱和。就我个人而已,python web…
-
安装gitlab runner 和配置.gitlab.yaml 实现自动化cicd
前面有讲到如何安装gitlab,它本身不仅仅可以实现代码仓库版本管理,当然可以做到cicd,简化手动部署到烦扰,实现自动化编译和部署 要做实现cicd,如果是虚拟机部署到话,当然离…