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判断key是否在map中的代码
Apr 24 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
golang 实现Location跳转方式
May 02 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
Golang 对es的操作实例
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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之第六天
2006/10/09 PHP
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
给ECShop添加最新评论
2015/01/07 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
一个javascript参数的小问题
2008/03/02 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
基于VUE.JS的移动端框架Mint UI的使用
2017/10/11 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
Python银行系统实战源码
2019/10/25 Python
使用Python实现分别输出每个数组
2019/12/06 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
岗位职责范本
2013/11/23 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
Java 死锁解决方案
2022/05/11 Java/Android