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 02 Golang
go语言map与string的相互转换的实现
Apr 07 Golang
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
Go timer如何调度
Jun 09 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言基础知识点介绍
Jul 04 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
golang生成并解析JSON
Apr 14 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang jwt身份认证
Apr 20 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二维/三维数组转字符串
2013/09/13 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
bpython 功能强大的Python shell
2016/02/16 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
自荐信的五个重要部分
2013/10/29 职场文书
服装公司总经理岗位职责
2013/11/30 职场文书
学前教育求职自荐信范文
2013/12/25 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
MySQL表的增删改查(基础)
2021/04/05 MySQL
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript
基于Python编写一个监控CPU的应用系统
2022/06/25 Python