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原生库的中bytes.Buffer用法
Apr 25 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
Go语言带缓冲的通道实现
Apr 26 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang入门之计时器
May 04 Golang
Go语言编译原理之源码调试
Aug 05 Golang
GO中sync包自由控制并发示例详解
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 采集程序中常用的函数
2009/12/09 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
php动态函数调用方法
2015/05/21 PHP
document.compatMode介绍
2009/05/21 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
js实现密码强度检验
2017/01/15 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python set集合类型操作总结
2014/11/07 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
python中doctest库实例用法
2020/12/31 Python
COS美国官网:知名服装品牌
2019/04/08 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
简单的JAVA编程面试题
2013/03/19 面试题
印刷工程专业应届生求职信
2013/09/29 职场文书
护士进修自我鉴定
2014/02/07 职场文书
合作协议书格式
2014/08/19 职场文书
企业党建工作总结2015
2015/05/26 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android