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 嵌套 interface 的赋值问题
Apr 29 Golang
golang elasticsearch Client的使用详解
May 05 Golang
go 实现简易端口扫描的示例
May 22 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang 入门 之url 包
May 04 Golang
Go语言编译原理之源码调试
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类的封装与继承详解
2015/09/29 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
Bootstrap每天必学之面板
2015/11/30 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
Python列表推导式的使用方法
2013/11/21 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python整数对象实现原理详解
2019/07/01 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
美国电视购物:QVC
2017/02/06 全球购物
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
全球性的在线商店:Vogca
2019/05/10 全球购物
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
某公司面试题
2012/03/05 面试题
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
五年级小学生评语
2014/12/26 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
工作犯错保证书
2015/05/11 职场文书
中小企业员工手册范本
2015/05/14 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server
Oracle 多表查询基本语法实例
2022/04/18 Oracle