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原生库的中bytes.Buffer用法
Apr 25 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
使用golang编写一个并发工作队列
May 08 Golang
Go语言基础知识点介绍
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
Go 内联优化让程序员爱不释手
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中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
深入分析原生JavaScript事件
2014/12/29 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
Python的pycurl包用法简介
2015/11/13 Python
基于Python的PIL库学习详解
2019/05/10 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
python提取xml里面的链接源码详解
2019/10/15 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
Python内置类型性能分析过程实例
2020/01/29 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
教师个人成长总结
2015/02/11 职场文书
军事博物馆观后感
2015/06/05 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript