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语言使用select{}阻塞main函数介绍
Apr 25 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang 编译成DLL文件的操作
May 06 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Go Plugins插件的实现方式
Aug 07 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
pytorch实现查看当前学习率
2020/06/24 Python
python多线程和多进程关系详解
2020/12/14 Python
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
如何写好闭幕词
2019/04/02 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
Python正则表达式中flags参数的实例详解
2022/04/01 Python