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 相关文章推荐
goland 恢复已更改文件的操作
Apr 28 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go语言grpc和protobuf
Apr 13 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang解析JSON对象
Apr 30 Golang
Golang gRPC HTTP协议转换示例
Jun 16 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重新实现PHP脚本引擎内置函数
2007/03/06 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
JavaScript DOM基础
2015/04/13 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
python简单实现操作Mysql数据库
2018/01/29 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
python使用PyQt5的简单方法
2019/02/27 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
pip安装python库的方法总结
2019/08/02 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
公司年会演讲稿范文
2014/01/11 职场文书
保护环境的标语
2014/06/09 职场文书
北京青年观后感
2015/06/15 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
在python中实现导入一个需要传参的模块
2021/05/12 Python