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 相关文章推荐
Golang 如何实现函数的任意类型传参
Apr 29 Golang
go设置多个GOPATH的方式
May 05 Golang
使用golang编写一个并发工作队列
May 08 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
golang生成并解析JSON
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
Golang 实现WebSockets
Apr 24 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 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中使用GD库创建圆形饼图的例子
2014/11/19 PHP
php制作动态随机验证码
2015/02/12 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
基于Vue框架vux组件库实现上拉刷新功能
2017/11/28 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
Python中的模块和包概念介绍
2015/04/13 Python
Python可变参数用法实例分析
2017/04/02 Python
python 为什么说eval要慎用
2019/03/26 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
成功的餐厅经营创业计划书
2014/01/15 职场文书
人事专员的职责
2014/02/26 职场文书
献爱心倡议书
2014/04/14 职场文书
消防志愿者活动方案
2014/08/23 职场文书
工作检讨书怎么写
2014/10/10 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python