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 26 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Go语言基础知识点介绍
Jul 04 Golang
深入理解go slice结构
Sep 15 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
Golang bufio详细讲解
Apr 21 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设计模式之模板方法模式实例浅析
2018/12/20 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
JS常见算法详解
2017/02/28 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python读写docx文件的方法
2018/05/08 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
《值日生》教学反思
2014/02/17 职场文书
征婚广告词
2014/03/17 职场文书
大学生社会实践自我鉴定
2014/03/24 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
欢迎横幅标语
2014/06/17 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技