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 相关文章推荐
golang 实现菜单树的生成方式
Apr 28 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
Go使用协程交替打印字符
Apr 29 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
深入理解go slice结构
Sep 15 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
深入理解 Golang 的字符串
May 04 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 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
一个改进的UBB类
2006/10/09 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
JS 显示当前日期与时间的代码
2010/03/24 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
微信小程序事件流原理解析
2019/11/27 Javascript
django2 快速安装指南分享
2018/01/05 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
abstract class和interface有什么区别
2013/08/04 面试题
资深生产主管自我评价
2013/09/22 职场文书
合作意向书范本
2014/03/31 职场文书
幼儿老师求职信
2014/06/30 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
2015年环保局工作总结
2015/05/22 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP