Golang使用Panic与Recover进行错误捕获


Posted in Golang onMarch 22, 2022

一、Golang 错误是什么?

对于Go语言(Golang)的错误是通过返回值的方式,来强迫调用者对错误进行处理,要么你通过 _ 忽略,要么你处理。对于这种设计方式,我们通常需要会写大量的 if err != nil 判断。我们可以通过方法来做到校验。

这类代码非常的多,尽管工程中 error 大部分都是nil,也就是没有任何错误,但是非nil的时候,就意味着错误就出现了。
在Go语言中,使用多值返回来返回错误。Go中可以抛出一个 panic 的异常,然后在 defe r中通过 recover 捕获这个异常,然后再正常处理。

二、错误校验

1.方法

当存在错误时,我们通过方法来判断是否 panic:

func Panic(err error) {

    if err != nil {
        panic(err)
    }
}

2.判断错误

代码如下(示例):

若不采用方法

for _, c := range []string{"1", "2"} {

        atoi, err := strconv.Atoi(c)
        if err != nil {
            return
        }
        fmt.Println(atoi)
    }

若采用方法

但此时 panic 还需要我们额外处理来将错误捕获

    for _, c := range []string{"1", "2"} {

        atoi, err := strconv.Atoi(c)
        Panic(err)
        fmt.Println(atoi)
    }

三、错误捕获

1.方法

当存在错误时,我们通过recover来判断 panic 是否产生:

func RecoverError() {

    if err := recover(); err != nil {
        //输出panic信息
        fmt.Println(err)

        //输出堆栈信息
        fmt.Println(string(debug.Stack()))
    }
}

2.defer 的使用

由于我们的捕获必须在错误产生之后,那我们就必须保证捕获方法调用在错误处理方法之后,也就是通过 defer 来控制方法的最后调用 :

func main() {
    // 当使用defer 时,将会在程序内方法结算后,
    // 依照后进先出的方法执行defer内方法
    // 此时就能保证 捕获程序一定能捕获到错误
    defer RecoverError()
    for _, c := range []string{"1", "2"} {

        atoi, err := strconv.Atoi(c)
        Panic(err)

        fmt.Println(atoi)
    }

}

总结

通过以上来简单熟悉Golang 与其他语言截然不同的错误处理形式,由于其他语言开发者经常将异常与控制结构混在一起,这会很容易使得代码变得混乱。开发者也很容易滥用异常,甚至一个小小的错误都抛出一个异常。这在Golang中不被允许,Go语言也就不支持传统的 try…catch…finally 这种异常,通过新的 defer panic recover 来进行错误处理。

到此这篇关于Golang 错误捕获Panic与Recover的使用的文章就介绍到这了,更多相关Golang 错误捕获内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
golang判断key是否在map中的代码
Apr 24 Golang
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
对Golang中的FORM相关字段理解
May 02 Golang
golang elasticsearch Client的使用详解
May 05 Golang
Golang之sync.Pool使用详解
May 06 Golang
go语言中fallthrough的用法说明
May 06 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
Go语言特点及基本数据类型使用详解
详解Golang如何优雅的终止一个服务
Mar 21 #Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 #Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 #Golang
Golang 并发下的问题定位及解决方案
Mar 16 #Golang
如何利用golang运用mysql数据库
深入理解go缓存库freecache的使用
Feb 15 #Golang
You might like
PHP面向对象编程快速入门
2006/12/14 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
js 通用订单代码
2013/12/23 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
python刷投票的脚本实现代码
2014/11/08 Python
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python中字典的setdefault()方法教程
2017/02/07 Python
python如何为创建大量实例节省内存
2018/03/20 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
django富文本编辑器的实现示例
2019/04/10 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
母亲节感恩寄语
2014/02/21 职场文书
一句话工作感言
2014/03/01 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
教师旷工检讨书
2015/08/15 职场文书
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技