go中宕机与恢复 panic/recover 介绍
目录
一、panic 宕机
二、recover恢复
三、panic和recover的关系
Go 语言可以在程序中手动触发宕机,让程序崩溃,这样开发者可以及时地发现错误,同时减少可能的损失。Go 语言程序在宕机时,会将堆栈和 goroutine 信息输出到控制台,所以宕机也可以方便地知晓发生错误的位置.
一、panic 宕机
func panic(v interface{})
panic() 的参数可以是任意类型,后文将提到的 recover 参数会接收从 panic() 中发出的内容。
package main
import "fmt"
func main(){defer fmt.Println("宕机后要做的事情1")defer fmt.Println("宕机后要做的事情2")fmt.Println("bb")panic("宕机")fmt.Println("dd")defer func(){fmt.Println("ee")}()
}
输出
bb
宕机后要做的事情2
宕机后要做的事情1
panic: 宕机goroutine 1 [running]:
main.main()/Users/root/Desktop/test.go:9 +0xf1
exit status 2
1、panic() 后面的代码将不会被运行
2、但是在 panic() 函数前面已经运行过的 defer 语句依然会在宕机发生时发生作用
二、recover恢复
Go 没有异常系统,其使用 panic 触发宕机类似于其他语言的抛出异常,那么 recover 的宕机恢复机制就对应 try/catch 机制。
无论是代码运行错误由 Runtime 层抛出的 panic 崩溃,还是主动触发的 panic 崩溃,都可以配合 defer 和 recover 实现错误捕捉和恢复,让代码在发生崩溃后允许继续运行。
package main
import "fmt"
func main() {defer func() {if info := recover(); info != nil {fmt.Println("触发了宕机", info)} else {fmt.Println("程序正常退出")}}()fmt.Println("bbbbbb")fmt.Println("cccccc")panic("fatal error")fmt.Println("ddddd")defer func() {fmt.Println("eeeeeeee")}()
}//代码运行
bbbbbb
cccccc
触发了宕机 fatal error
三、panic和recover的关系
panic 和 defer 的组合有如下特性
- 有 panic 没 recover,程序宕机。
- 有 panic 也有 recover 捕获,程序不会宕机。执行完对应的 defer 后,从宕机点退出当前函数后继续执行。
1)虽然 panic/recover 能模拟其他语言的异常机制,但并不建议代表编写普通函数也经常性使用这种特性。
2)在 panic 触发的 defer 函数内,可以继续调用 panic,进一步将错误外抛直到程序整体崩溃。
3)如果想在捕获错误时设置当前函数的返回值,可以对返回值使用命名返回值方式直接进行设置。
go中宕机与恢复 panic/recover 介绍相关推荐
- Redis中主、从库宕机如何恢复?
作者 | tamir_2017 来源 | blog.csdn.net/py_tamir/article/details/82555338 1.什么是哨兵 哨兵是对Redis的系统的运行情况的监控,它是 ...
- Redis 中哨兵sentinel 机制、从宕机及恢复、主库宕机及恢复解决方案
目录 什么是哨兵 原理 环境 设置哨兵 从宕机及恢复 主宕机及恢复 配置多个哨兵 1.什么是哨兵 哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个: 监控主数据库和从数据库是否运 ...
- 主域控宕机无法恢复后,如何配置辅助域控继续工作
情况如下: 系统基础结构如下:一个主域控,一个辅助域控且都安装AD与DNS集成区. 如果: 主域控宕机且无法恢复,请问辅助域应做些什么才能替代主域控继续工作? 第一步:在辅助域控上清除主域控AD数 ...
- 黑科技揭秘:阿里云如何做到从业务宕机到恢复业务运行只用一分半钟时间
2018杭州云栖大会主论坛上,阿里云打造的混合云容灾方案惊喜亮相,并直接在现场进行了全过程的演示,凸显出阿里云技术的强大心智. 整个混合云容灾演示在5分钟内呈现了阿里云秒级RPO,分钟级RTO企业应用 ...
- Hadoop HA namenode宕机环境恢复
描述 Ambari管理的Hadoop生产集群开启了HA,在运行期间,namenode1(nn1)为活跃(active)namenode,namenode2(nn2)为备用(standby)nameno ...
- mysql事务中宕机_事务执行一半,业务系统宕机,数据库的数据会怎样?
业务系统提交了一个数据库dml指令,在尚未进行提交时,系统宕机了.那么数据库的数据会是修改前的,还是修改后的?数据库中的连接是否会断开,数据是否会被锁定?带着这些疑问,我们做的如下测试: 1.在数据库 ...
- mysql宕机恢复_MySQL:数据库宕机以后恢复的过程?如何保证事务的ACID特性?
首先介绍几个概念: REDO 为了重做对数据页(page)更改保存的信息,用于恢复 UNDO 为了撤销对数据记录(tuple)更改保存的信息,用于回滚事务 LSN(Log Sequence NO) 日 ...
- 恢复Redis中主、从库宕机
1.什么是哨兵 哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个: 监控主数据库和从数据库是否运行正常: 主数据出现故障后自动将从数据库转化为主数据库: 2.原理 单个哨兵的架构 ...
- Go的宕机与宕机恢复
拜一拜,永不宕机 宕机 啥是宕机 手动触发宕机 宕机恢复 ps 你以为结束了 宕机 话说这是一个风和日丽的上午,拿到了外卖小哥送来的我最心爱的麻辣烫,我打开了因为昨天刚充了三毛钱电费而恢复了使用的电脑 ...
最新文章
- 14 集成测试方法之自底向上集成方法
- oracle 拼接sql 日期,动态SQL对日期处理注意事项
- 手把手教你用Java的swing制作计算器
- C++判断是否为素数、求一个数的因数、质因数分解
- 阿里云云安全中心入选Gartner CWPP全球市场指南
- mysql快速启动bat
- 隐变量模型(latent variable model)
- 小D课堂 - 新版本微服务springcloud+Docker教程_2_01传统架构演进到分布式架构
- 将xml文件由格式化变为压缩字符串
- 验票证明怎么打印_发票真伪查询打印系统软件
- Gut Microbes:南医大刘星吟组-孤独症的基因变异与肠道微生物群、代谢物和细胞因子的改变有关...
- 机器学习算法初识—二分k均值算法
- MySQL--Select条件判断、in、not in、and、or、以及like匹配字符语句查询
- 项目合同与劳务合同的区别
- python excel 空值_用Python轻松搞定Excel中的20个常用操作
- 如何输入版权符号 copyright
- unison + inotify 实现文件实时双向同步部署步骤
- win10应用商店linux_解决win10应用商店“由于公司策略 此应用已被阻止”的方法...
- JavaScript 和读取服务器cookie
- Java中2.5D游戏(斜45度角)的设计与实现(1)
热门文章
- 用UltraISO制作Ubuntu_18.04U盘启动盘
- 中国数字银行春季论坛热议高质量发展 金融科技破解资产负债管理难题
- JavaWeb 实验 Servlet用户登录验证
- 期货配资的优势和劣势
- 加密php代码一担粮,分享8个PHP开发常用代码片段_后端开发
- zookeeper 删除节点时报错java.io.IOException: Packet len4272892 is out of range!
- 国内代码托管平台gitee的使用
- 简述:静态工作点(Q点),直流负载线,交流负载线
- 先验概率与后验概率是什么
- 红米5双清_小米红米5 plus(安卓8.0)刷官方中文Recovery教程,recovery工具分享,recovery下载...