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 25 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Go并发4种方法简明讲解
Apr 06 Golang
golang的文件创建及读写操作
Apr 14 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 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获取金书网的书名的实现代码
2010/06/11 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
详解node和ES6的模块导出与导入
2020/02/19 Javascript
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
Java的基础面试题附答案
2016/01/10 面试题
精彩的推荐信范文
2013/11/26 职场文书
自我评价范文点评
2013/12/04 职场文书
文明学生标兵事迹
2014/01/21 职场文书
鸿星尔克广告词
2014/03/21 职场文书
党委领导班子整改方案
2014/09/30 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
搞笑老公保证书
2015/02/26 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python