Golang 错误捕获Panic与Recover的使用
作者:头秃猫轻王 发布时间:2024-02-07 20:15:42
标签:Golang,错误捕获,Panic,Recover
一、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)
}
}
来源:https://blog.csdn.net/moer0/article/details/123593492


猜你喜欢
- 在pandas中创建category类型数据的几种方法之详细攻略 T1、直接创建 category类型数据可知,在category
- 本文实例讲述了python实现控制电脑鼠标和键盘,登录QQ的方法。分享给大家供大家参考,具体如下:import osfrom pynput.
- 实例如下所示:from tensorflow.python import pywrap_tensorflowcheckpoint_path
- 一、前提条件安装了Fiddler了(用于抓包分析)谷歌或火狐浏览器如果是谷歌浏览器,还需要给谷歌浏览器安装一个SwitchyOmega插件,
- 1.1.1 摘要 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接、外联接和交叉联接等。如果我们想
- 最近在学习Python3网络爬虫开发实践(崔庆才 著)刚好也学习到他使用代理爬取公众号文章这里,但是照着他的代码写,出现了一些问题。在这里我
- 实现原理PS的扩散效果可以产生类似毛玻璃质感的效果,使画面有些毛毛的感觉。其实现可通过操作像素三通道数值的方式实现,定义一个随机数器,将图像
- 本文实例讲述了Yii2框架实现登陆添加验证码功能。分享给大家供大家参考,具体如下:models中LoginForm.phppublic $v
- 不知道大家有没有一种感觉,每次当使用numpy数组的时候坐标轴总是傻傻分不清楚,然后就会十分的困惑,每次运算都需要去尝试好久才能得出想要的结
- antd-日历组件,前后禁止选择,只能选中间一部分:dateDisabledDate(current) { // 需求有效期的禁止选择时间
- 介绍reflect包实现运行时反射,允许一个程序操作任何类型的对象。典型的使用是:取静态类型interface{}的值,通过调用TypeOf
- 这是一个很长的故事,嫌长的直接看最后的结论事情经过上周接了个需求,写了个小工具给客户,他要求打包成exe文件,这当然不是什么难事。因为除了写
- 在jQuery的官方文档中,提示用户这是一个低级的方法,应该用.data()方法来代替。$.data( element, key, valu
- 代码优化 for($i=0;$i<8;$i++){ array_push($week,$arr); } for($i=0;$i<
- 一、什么是系统调用In computing, a system call is the programmatic way in which
- 本文实例讲述了Vue插槽原理与用法。分享给大家供大家参考,具体如下:1 插槽内容Vue 实现了一套内容分发的 API,这套 API 基于当前
- /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ',
- 你是否知道JavaScript其实也是一个函数式编程语言呢?本指南将教你如何利用JavaScript的函数式特性。要求:你应当已经对Java
- 本文实例讲述了php+html5基于websocket实现聊天室的方法。分享给大家供大家参考。具体如下:html5的websocket 实现
- 大部分服务器管理员知道MySQL数据库管理系统(RDBMS)是高度灵活的软件块,带有范围广阔的启动选项,可以用来修改相关行为。然而,大部分人