Golang中异常处理机制详解


Posted in Golang onJune 08, 2021

前言

通常我们需要编写好的错误处理方式,在了避免某些程序员滥用异常,于是Go这里直接把异常这一块给砍掉了,最终还是通过返回值来判断程序的异常情况,毕竟Go可是支持多返回值的语言,比如atoi、itoa等函数,就不能忽略它的第二个返回值,因为第二个返回值代表了转换是否成功!不过Golang还是提供了一些错误处理机制的

Golang中异常处理机制详解

Go的错误机制

1、没有异常机制

2、error类型实现了error接口

3、可以通过errors.New来快速创建错误实例

type error interface{
    Error() string
}

error.New("n must be in range[0, 1]")

Golang中异常处理机制详解

但是这样做只是给开发者标识,Code怎么认识呢?难道去string里判断吗?当然不是,可以预定义一些错误:

Golang中异常处理机制详解

处理错误最佳实践

1、预定义错误,code里判断

2、及早失败,避免嵌套

panic与recover

panic用于不可恢复的错误,类似于Java的Error
panic退出前会执行defer指定的内容

panic和os.Exit
os.Exit退出时不会调用defer指定的函数
os.Exit退出时不会输出当前调用栈信息

Golang中异常处理机制详解

接下来看看recover

在Java中如果你不知道要抛出什么错误,于是乎很多人直接来个Catch Throwable,作为一个异常无Fack说,C++中是直接catch…作为一个异常无Fack说

Golang中异常处理机制详解

在Go语言中可以通过defer定义的函数去执行一些错误恢复的行为

Golang中异常处理机制详解

很多人容易在defer处理错误时把recover获得的错误对象打印到日志文件中,这是一种非常危险的做法,一定要当心recover在做的事情,因为recover的时候并不去检测到底发生了什么错误,而是直接忽略了这个错误,那么如果这个时候系统的核心资源消耗完了,如果我们强制性的恢复的话系统仍然是不能正常工作的,还会导致我们的健康检查程序没办法检查出当前系统的问题,因为很多的health check只是检查进程在还是不在,因为我们的进程是在的,所以会导致僵尸服务进程,虽然活着但是无法正常提供服务。于是我们可以采用恢复设计模式中的一种叫做Let it Crash ,health check进程就会帮我们重启这个服务

Golang中异常处理机制详解

总结

到此这篇关于Golang中异常处理机制的文章就介绍到这了,更多相关Golang异常处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
golang interface判断为空nil的实现代码
Apr 24 Golang
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
golang elasticsearch Client的使用详解
May 05 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
Golang解析JSON对象
Apr 30 Golang
Go语言实现Snowflake雪花算法
Jun 08 #Golang
go语言中http超时引发的事故解决
Jun 02 #Golang
Golang二维数组的使用方式
May 28 #Golang
Golang标准库syscall详解(什么是系统调用)
May 25 #Golang
go 实现简易端口扫描的示例
May 22 #Golang
go xorm框架的使用
May 22 #Golang
Golang实现AES对称加密的过程详解
May 20 #Golang
You might like
php获取apk包信息的方法
2014/08/15 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
Python 下载及安装详细步骤
2019/11/04 Python
python实现实时视频流播放代码实例
2020/01/11 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
演讲稿怎么写
2014/01/07 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
开国大典观后感
2015/06/04 职场文书
杨善洲观后感
2015/06/04 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书
2015元旦感言
2015/12/09 职场文书
护理培训心得体会
2016/01/22 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android