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语言map与string的相互转换的实现
Apr 07 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
Go语言基础知识点介绍
Jul 04 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
Golang解析JSON对象
Apr 30 Golang
深入理解 Golang 的字符串
May 04 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 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中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
javascript两段代码,两个小技巧
2010/02/04 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
如何抽象一个Vue公共组件
2017/10/17 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
python实现周期方波信号频谱图
2018/07/21 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
详解用python生成随机数的几种方法
2019/08/04 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
python创建学生管理系统
2019/11/22 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
企业申诉管理制度
2014/01/30 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
加强作风建设工作总结
2014/10/23 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
研究生个人学年总结
2015/02/14 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
Python语言内置数据类型
2022/02/24 Python