目录

一、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 介绍相关推荐

  1. Redis中主、从库宕机如何恢复?

    作者 | tamir_2017 来源 | blog.csdn.net/py_tamir/article/details/82555338 1.什么是哨兵 哨兵是对Redis的系统的运行情况的监控,它是 ...

  2. Redis 中哨兵sentinel 机制、从宕机及恢复、主库宕机及恢复解决方案

    目录 什么是哨兵 原理 环境 设置哨兵 从宕机及恢复 主宕机及恢复 配置多个哨兵 1.什么是哨兵 哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个: 监控主数据库和从数据库是否运 ...

  3. 主域控宕机无法恢复后,如何配置辅助域控继续工作

    情况如下: 系统基础结构如下:一个主域控,一个辅助域控且都安装AD与DNS集成区. 如果:   主域控宕机且无法恢复,请问辅助域应做些什么才能替代主域控继续工作? 第一步:在辅助域控上清除主域控AD数 ...

  4. 黑科技揭秘:阿里云如何做到从业务宕机到恢复业务运行只用一分半钟时间

    2018杭州云栖大会主论坛上,阿里云打造的混合云容灾方案惊喜亮相,并直接在现场进行了全过程的演示,凸显出阿里云技术的强大心智. 整个混合云容灾演示在5分钟内呈现了阿里云秒级RPO,分钟级RTO企业应用 ...

  5. Hadoop HA namenode宕机环境恢复

    描述 Ambari管理的Hadoop生产集群开启了HA,在运行期间,namenode1(nn1)为活跃(active)namenode,namenode2(nn2)为备用(standby)nameno ...

  6. mysql事务中宕机_事务执行一半,业务系统宕机,数据库的数据会怎样?

    业务系统提交了一个数据库dml指令,在尚未进行提交时,系统宕机了.那么数据库的数据会是修改前的,还是修改后的?数据库中的连接是否会断开,数据是否会被锁定?带着这些疑问,我们做的如下测试: 1.在数据库 ...

  7. mysql宕机恢复_MySQL:数据库宕机以后恢复的过程?如何保证事务的ACID特性?

    首先介绍几个概念: REDO 为了重做对数据页(page)更改保存的信息,用于恢复 UNDO 为了撤销对数据记录(tuple)更改保存的信息,用于回滚事务 LSN(Log Sequence NO) 日 ...

  8. 恢复Redis中主、从库宕机

    1.什么是哨兵 哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个: 监控主数据库和从数据库是否运行正常: 主数据出现故障后自动将从数据库转化为主数据库: 2.原理 单个哨兵的架构 ...

  9. Go的宕机与宕机恢复

    拜一拜,永不宕机 宕机 啥是宕机 手动触发宕机 宕机恢复 ps 你以为结束了 宕机 话说这是一个风和日丽的上午,拿到了外卖小哥送来的我最心爱的麻辣烫,我打开了因为昨天刚充了三毛钱电费而恢复了使用的电脑 ...

最新文章

  1. 14 集成测试方法之自底向上集成方法
  2. oracle 拼接sql 日期,动态SQL对日期处理注意事项
  3. 手把手教你用Java的swing制作计算器
  4. C++判断是否为素数、求一个数的因数、质因数分解
  5. 阿里云云安全中心入选Gartner CWPP全球市场指南
  6. mysql快速启动bat
  7. 隐变量模型(latent variable model)
  8. 小D课堂 - 新版本微服务springcloud+Docker教程_2_01传统架构演进到分布式架构
  9. 将xml文件由格式化变为压缩字符串
  10. 验票证明怎么打印_发票真伪查询打印系统软件
  11. Gut Microbes:南医大刘星吟组-孤独症的基因变异与肠道微生物群、代谢物和细胞因子的改变有关...
  12. 机器学习算法初识—二分k均值算法
  13. MySQL--Select条件判断、in、not in、and、or、以及like匹配字符语句查询
  14. 项目合同与劳务合同的区别
  15. python excel 空值_用Python轻松搞定Excel中的20个常用操作
  16. 如何输入版权符号 copyright
  17. unison + inotify 实现文件实时双向同步部署步骤
  18. win10应用商店linux_解决win10应用商店“由于公司策略 此应用已被阻止”的方法...
  19. JavaScript 和读取服务器cookie
  20. Java中2.5D游戏(斜45度角)的设计与实现(1)

热门文章

  1. 用UltraISO制作Ubuntu_18.04U盘启动盘
  2. 中国数字银行春季论坛热议高质量发展 金融科技破解资产负债管理难题
  3. JavaWeb 实验 Servlet用户登录验证
  4. 期货配资的优势和劣势
  5. 加密php代码一担粮,分享8个PHP开发常用代码片段_后端开发
  6. zookeeper 删除节点时报错java.io.IOException: Packet len4272892 is out of range!
  7. 国内代码托管平台gitee的使用
  8. 简述:静态工作点(Q点),直流负载线,交流负载线
  9. 先验概率与后验概率是什么
  10. 红米5双清_小米红米5 plus(安卓8.0)刷官方中文Recovery教程,recovery工具分享,recovery下载...