Go的宕机与宕机恢复
拜一拜,永不宕机
- 宕机
- 啥是宕机
- 手动触发宕机
- 宕机恢复
- ps
- 你以为结束了
宕机
话说这是一个风和日丽的上午,拿到了外卖小哥送来的我最心爱的麻辣烫,我打开了因为昨天刚充了三毛钱电费而恢复了使用的电脑,登上了满是美女好友的微信,熟悉的声音马上响彻在了我这三百平米的卧室中,果然我的魅力无法让人自拔,点开这闪烁的美女头像,一行文字映入眼帘,项目出bug了,直接宕机了,五分钟处理了,不然麻辣烫给你倒了…… 真好
跑题了……废话不多说,上货
啥是宕机
我认为go语言中的宕机和报错差不多,数组访问越界、空指针引用等,这些运行时错误都会引起宕机,宕机后程序就会停止,编译器就会输出对应的报错信息,包括 panic value 和函数调用的堆栈跟踪信息,panic value 通常是某种错误信息
看上去宕机好像没什么好处,但其实有时合理的宕机是一种非常明智的止损方式。
手动触发宕机
类似其他语言,比如java手动 throw 一个 error 一样,Go也有手动触发宕机的方式——panic()
package mainimport "fmt"
func main() {//xxxxxxxfmt.Println("我上面有一万行代码") panic("一万行也没用,我出毛病了")fmt.Println("我不好使了")
}
Go语言程序在宕机时,会将堆栈和 goroutine 信息输出到控制台,所以宕机也可以方便地知晓发生错误的位置。上面就展示第7行发生了错误
如果我们想让方法最后宕机,不导致其他语句的执行可以使用defer
package mainimport "fmt"
func main() {//xxxxxxxfmt.Println("我上面有一万行代码") defer panic("一万行也没用,我出毛病了")fmt.Println("哎,我又好使了")
}
为什么会有两个错误信息呢,因为defer会在当前行加载,所以产生了第一次报错,后在方法后进行执行,产生了第二个报错。
宕机恢复
如果我们想在宕机后仍让程序继续执行,可以使用recover ,跟java中try/catch作用差不多,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果,如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行。
package mainimport "fmt"func test () {defer func() {err := recover()if err != nil {fmt.Println("我说好使了你信不信") }}()//调用匿名函数demo ()
}func demo () {fmt.Println("一万行也没用,我出毛病了,下面都不好使") defer panic("我还能说啥,说啥都不好使了")
}
func main() {//xxxxxxxfmt.Println("我上面有一万行代码") test()fmt.Println("哎,我又好使了") }
panic 和 recover 的组合有如下特性:
有 panic 没 recover,程序宕机。
有 panic 也有 recover,程序不会宕机,执行完对应的 defer 后,从宕机点退出当前函数后继续执行。
ps
虽然 panic/recover 能模拟其他语言的异常机制,但并不建议在编写普通函数时也经常性使用这种特性
在 panic 触发的 defer 函数内,可以继续调用 panic,进一步将错误外抛,直到程序整体崩溃
如果想在捕获错误时设置当前函数的返回值,可以对返回值使用命名返回值方式直接进行设置
你以为结束了
搞明白了如何恢复宕机的我拿着recover直接将导致宕机的方法捕捉,然后上去就是一顿乌鸦坐飞机,这回大功告成,赶紧回复处理完了
不一会收到回复,写的什么玩意,你就这么处理的嘛,留的坑给谁填,不仅这个月麻辣烫没了,下个月也没了
真是美好的一天……
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!
Go的宕机与宕机恢复相关推荐
- 腾讯出行在微信内测试打车功能;微软Teams全球宕机数小时后恢复正常;iOS 15.6 修复显示储存空间已满问题|极客头条
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
- 腾讯出行在微信内测试打车功能;微软Teams全球宕机数小时后恢复正常;iOS 15.6 修复显示储存空间已满问题|极客头条...
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
- 计算机卡住了怎样恢复,电脑死机按什么键恢复
描述 如何判断电脑是否死机 判断机器处于死机状态.状态的方法是按键的NumLock键,看Num灯是不是会随着键的按下改变状态.如果不改变,那么就是处于死机状态. 电脑死机按什么键恢复 1.按CTRL+ ...
- 手机刷机失败数据怎么恢复
手机刷机失败数据怎么恢复 都说人切忌有贪念,此话还真不是盖的,前段时间,朋友想给自己的手机刷机,说这样差不多就等于免费将自己的手机从旧版本升级到了最新的版本,虽然手机的外壳没有变,但是手机的内在确实发 ...
- 电脑死机按什么键恢复?快速恢复,试试这3个方法
电脑死机是一个常见的问题,无论什么电脑都会死机,那么电脑死机按什么键恢复呢?常见的方式是按下键盘"Ctrl"+"Alt"+"Del"组合键 ...
- 从单机到多机:多机一定比单机快吗?秒杀系统到底有没有必要用分布式锁?
从单机到多机:多机一定比单机快吗?秒杀到底有没有必要用分布式锁? 一.单机场景 单机能承受的 TPS tomcat 500~1000 mysql 200~800 在单机状态下,tomcat 能接受的请 ...
- QT5实现串口收发数据(上位机与下位机通信)
最近帮老师做一个应用程序,通过上位机与下位机进行串口通信,最后实现实时绘图,通过几天努力,成功实现蓝牙串口通信. 参考博客1 注意:代码中一些与串口无关代码,可以忽略掉 一.QT5串口基础知识 1. ...
- 用USB代替网络通讯,实现Cartographer上位机与下位机之间的消息传递
任务动机:用USB代替网络通讯,实现Cartographer上位机与下位机之间的消息传递. 任务描述:根据任务动机,研发实现用USB代替网络通讯,形成文档. 1. 在Toybrick-RK3399 P ...
- 修复nexus4由于使用完美刷机或者刷机精灵导致的底层文件受损
前一段nexus4升级android 4.4.4的时候突然发现无法使用线刷刷入官方镜像了.当时就感觉很奇怪,但是不知道怎么搞得刷进去了,但是第一次开机的时候总是卡在联网之后的验证(我当时以为是网络不好 ...
最新文章
- fileZilla连接oracle服务器,传DMP文件
- [转]25个增强iOS应用程序性能的提示和技巧
- 1到10用递归c语言,为什么这个递归能输出1到10
- link linux 跨设备,Linux中的两种link方式
- java 工作一年_干java工作了快一年,到底会了什么
- C语言学习笔记---指针
- 一次PHP中SQL的Where子句无效问题的解决之旅
- map java 用法_java中map 9种常规用法
- Symantec 不用密码卸载
- 图论/暴力 Codeforces Beta Round #94 (Div. 2 Only) B. Students and Shoelaces
- 正确理解和使用GBK及UTF-8编码
- 细数那些年ZStack拿过奖的案例
- 免签约即时到账支付接口 个人二维码收款系统源码【多种模式】
- centos7 RPM包之rpm命令
- Android修行手册-EditText属性以及光标和小键盘控制
- vue使用原生高德地图
- python 合并word内容_python如何合并两个文档内容
- 想做AR/VR相关创新项目,有什么好方向?要怎么做?
- LDO investigation
- 极验验证的滑动验证码破解
热门文章
- STM32学习笔记(十七)TLTLCD显示实验
- 解决TeamViewer远程连接受阻的方法
- java 集合数据类型_Java基础知识(数据类型和集合)
- 基于微信小程序的乐团团购系统设计与实现-计算机毕业设计源码+LW文档
- 淘宝喵果总动员自动做任务脚本
- 郑州oracle代理,郑州甲骨文(Oracle)培训OCM直通车
- 人机大战硝烟再起:阿尔法狗升级了 柯洁拼了
- linux磁盘sda1变化,linux系统中sda变成sdb了怎么办
- S5PV210-uboot源码分析-第二阶段
- 安徽省2019c语言二级答案,二级c语言真题及答案