Go语言学习笔记之错误和异常详解
作者:鹿鱼 发布时间:2024-02-05 11:39:15
错误
Go 语言通过内置的错误接口提供了非常简单的错误处理机制,Error 类型是一个接口类型。
type error interface {
Error() string
}
可以在编码中通过实现 error 接口类型来生成错误信息。
函数通常在最后的返回值中返回错误信息。
// 定义一个 DivideError 结构
type DivideError struct {
dividee int
divider int
}
// 实现 `error` 接口
func (de *DivideError) Error() string {
strFormat := `
Cannot proceed, the divider is zero.
dividee: %d
divider: 0
`
return fmt.Sprintf(strFormat, de.dividee)
}
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
if varDivider == 0 {
dData := DivideError{
dividee: varDividee,
divider: varDivider,
}
errorMsg = dData.Error()
return
} else {
return varDividee / varDivider, ""
}
}
Divide 函数传入除数和被除数,当被除数为零时,函数抛出异常。
if result, errorMsg := Divide(100, 10); errorMsg == "" {
fmt.Println(result)
}
这是正常情况下。
当除数为零的时候会返回错误信息。
if _, errorMsg := Divide(100, 0); errorMsg != "" {
fmt.Println("errorMsg is: ", errorMsg)
}
异常
Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等。这些运行时错误会引起painc异常。
当程序发生异常时,无法继续运行,使用 panic
来终止程序。
应该尽可能地使用错误,而不是使用 panic
和 recover
。只有当程序不能继续运行的时候,才应该使用 panic
和 recover
机制。
panic
有两个合理的用例:
发生了一个不能恢复的错误,此时程序不能继续运行。
发生了一个编程上的错误。一个接收指针参数的方法,而其他人使用
nil
作为参数调用了它。在这种情况下,可以使用panic
,因为这是一个编程错误:用nil
参数调用了一个只能接收合法指针的方法。
内建函数 panic
:
func panic(v interface{})
当程序终止时,会打印传入 panic
的参数。
package main
func main() {
panic("panic error")
}
会打印出传入 panic
函数的信息,并打印出堆栈跟踪。
recover
是一个内建函数,用于重新获得 panic
协程的控制。
func recover() interface{}
recover
必须在 defer
函数中才能生效,在延迟函数内调用 recover
,可以取到 panic
的错误信息,并且停止 panic
续发事件。只有在相同的协程中调用 recover
才管用, recover
不能恢复一个不同协程的 panic
。
package main
import "fmt"
func outOfArray(x int) {
defer func() {
// recover() 可以将捕获到的 panic 信息打印
if err := recover(); err != nil {
fmt.Println(err)
}
}()
var array [5]int
array[x] = 1
}
func main() {
// 故意制造数组越界 触发 panic
outOfArray(20)
// 如果能执行到这句 说明 panic 被捕获了
// 后续的程序能继续运行
fmt.Println("main...")
}
来源:https://juejin.cn/post/7123831661782892581
猜你喜欢
- 1.引言甘特图已经拥有 100 多年的历史,这种可视化图表对项目管理非常有用。Henry Gantt 为了分析已经完成的项目创建了甘特图,他
- MS SQL基本语法及实例操作 一:建表并初始化 ============================ create database
- 字符串格式化输出是python非常重要的基础语法,今天就把三种格式化输出做一个简单的总结,希望对大家有帮助。格式化输出:内容按照一定格式要求
- 本文实例讲述了Python3实现的回文数判断及罗马数字转整数算法。分享给大家供大家参考,具体如下:回文数判断一个整数是否是回文数。回文数是指
- 代码如下:--程序员们在编写一个雇员报表,他们需要得到每个雇员当前及历史工资状态的信息, --以便生成报表。报表需要显示每个人的晋升日期和工
- 一次性验证码,英文是 One Time Password,简写为 OTP,又称动态密码或单次有效密码,是指计算机系统或其他数字设备上只能使用
- <SCRIPT language=vbscript event=BeforeInitialBind(i
- 通过cpython把python的文件转换为二进制文件,达到代码保护的目的1、下载Cython-0.28.2.tar.gz python s
- 只做简单地记录,方便一下使用!python关于csv模块的介绍网上有很多资料,这里就不在赘诉。直接给出代码和解释。数据:Symbol,Pri
- 下面是列表合并的4种方法,其中的代码都在Python3下测试通过,在Python2下运行应该也没问题,时间关系就没测试,遇到问题可以联系小编
- 本文实例讲述了Python实现可自定义大小的截屏功能。分享给大家供大家参考,具体如下:蝈蝈这两天正忙着收拾家当去公司报道,结果做PHP的发小
- 在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块、get请
- 为什么,这么简单的一个python,我还要特意来写一篇文章呢?是因为留念下,在使用了Anaconda2和Anaconda3的基础上,现在需安
- 核心代码--下面我演示下MySQL中的排序列的实现--测试数据CREATE TABLE tb(score INT);INSERT tb SE
- 如下所示:import cv2 # [1]导入OpenCv开源库import numpy as npimage_path = "F
- 1在配置文件中添加skip-grant-tables后重启mysql,然后直接登录[root@tyjs09 ~]# cat /etc/my.
- Windows环境下一、开启 Imagick 扩展1、安装PHP扩展:Imagick,下载地址 https://pecl.php.net/p
- 在使用Tkinter做界面时,遇到这样一个问题:程序刚运行,尚未按下按钮,但按钮的响应函数却已经运行了例如下面的程序:from Tkinte
- 本文介绍了使用Python来扫描指定目录下的文件,或者匹配指定后缀和前缀的函数。步骤如下:如果要扫描指定目录下的文件,包括子目录,需要调用s
- 项目地址:https://github.com/Henryhaohao/Bilibili_video_download介绍对于单P视频:直接