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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
Go使用协程交替打印字符
Apr 29 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go 语言结构实例分析
Jul 04 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
基于Python实现西西成语接龙小助手
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文件目录基础操作
2014/11/11 PHP
php生成图片缩略图的方法
2015/04/07 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
Python命名空间详解
2014/08/18 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
python实现反转部分单向链表
2018/09/27 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
如何理解委托
2012/01/06 面试题
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
高中语文课后反思
2014/04/27 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
放射科岗位职责
2015/02/14 职场文书
Html5调用企业微信的实现
2021/04/16 HTML / CSS
Python爬虫实战之爬取携程评论
2021/06/02 Python
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers