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
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go语言测试库testify使用学习
Jul 23 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抽象类和接口知识点整理总结
2019/08/02 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
微信小程序 简单教程实例详解
2017/01/13 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
详解Python的Django框架中的模版相关知识
2015/07/15 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python join方法使用详解
2019/07/30 Python
python3 深浅copy对比详解
2019/08/12 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
python 实现逻辑回归
2020/12/30 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
自动化系在校本科生求职信
2013/10/23 职场文书
食品业务员岗位职责
2014/03/18 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang