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 Gin实现文件上传下载的示例代码
Apr 02 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
golang中的并发和并行
May 08 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 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 JSON中文乱码的解决方法详解
2013/06/06 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
js输出列表实现代码
2010/09/12 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
Vue中的$set的使用实例代码
2018/10/08 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
vue登录注册实例详解
2019/09/14 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
Python处理文本文件中控制字符的方法
2017/02/07 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
python自动生成证件号的方法示例
2021/01/14 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
Ruby如何实现动态方法调用
2012/11/18 面试题
学习十八大报告感言
2014/02/28 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
关于召开会议的通知
2015/04/15 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python