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二维切片初始化的实现
Apr 08 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
Go语言中的UTF-8实现
Apr 26 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
golang 实现并发求和
May 08 Golang
Go Plugins插件的实现方式
Aug 07 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang日志包的使用
Apr 20 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009/01/30 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
jquery蒙版控件实现代码
2010/12/08 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
python单线程实现多个定时器示例
2014/03/30 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
Django Rest framework权限的详细用法
2019/07/25 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
python修改FTP服务器上的文件名
2019/09/11 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
应届生个人求职信模板
2013/11/26 职场文书
个人实习生的自我评价
2014/02/16 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
关于安全的演讲稿
2014/05/09 职场文书
租房协议书范文
2014/08/20 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
成绩单评语
2015/01/04 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python