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 生成对应的数据表struct定义操作
Apr 28 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
对Golang中的FORM相关字段理解
May 02 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
golang中的struct操作
Nov 11 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下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
php中in_array函数用法探究
2014/11/25 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
布同 统计英文单词的个数的python代码
2011/03/13 Python
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
关于python3中setup.py小概念解析
2019/08/22 Python
Python中包的用法及安装
2020/02/11 Python
python实现TCP文件传输
2020/03/20 Python
药剂专业学生求职信范文
2013/12/28 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
《木笛》教学反思
2014/03/01 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP