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
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Golang二维数组的使用方式
May 28 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang 入门 之url 包
May 04 Golang
Go web入门Go pongo2模板引擎
May 20 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上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
PHP链表操作简单示例
2016/10/15 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
js变量提升深入理解
2016/09/16 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
Python Json数据文件操作原理解析
2020/05/09 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
勤俭节约演讲稿
2014/05/08 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
先进班集体事迹材料
2014/12/25 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL