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 相关文章推荐
Go各时间字符串使用解析
Apr 02 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang入门之计时器
May 04 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 Golang
Go语言测试库testify使用学习
Jul 23 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
vue实现信息管理系统
2020/05/30 Javascript
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
python机器学习实现决策树
2019/11/11 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
应届生财务会计求职信
2013/11/05 职场文书
信息系统专业个人求职信范文
2013/12/07 职场文书
小学新学期教师寄语
2014/01/18 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python
Redis可视化客户端小结
2021/06/10 Redis
Elasticsearch 数据类型及管理
2022/04/19 Python