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语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
Golang: 内建容器的用法
May 05 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
深入理解 Golang 的字符串
May 04 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
基于Python实现西西成语接龙小助手
Aug 05 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动态生成VRML网页
2006/10/09 PHP
php操作JSON格式数据的实现代码
2011/12/24 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
解决nginx不支持thinkphp中pathinfo的问题
2015/07/21 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
js实现继承的5种方式
2015/12/01 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
js数据类型检测总结
2018/08/05 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
Python优先队列实现方法示例
2017/09/21 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
韩语专业本科生求职信
2013/10/01 职场文书
办公室年终个人自我评价
2013/10/28 职场文书
初中生自我评价
2014/02/01 职场文书
食品安全演讲稿
2014/09/01 职场文书
项目建议书
2015/02/04 职场文书
文书工作总结(范文)
2019/07/11 职场文书
深入理解python多线程编程
2021/04/18 Python