GO语言异常处理分析 err接口及defer延迟


Posted in Golang onApril 14, 2022

err接口

Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下:

type error interface {
    Error() string
}

调用对应接口

err:=errors.New("this is normal err")
	fmt.Println(err.Error())
	err2:=fmt.Errorf("this is normal err")
	fmt.Println(err2)

案例:除数b为0时

package main
import (
	"errors"
	"fmt"
)
func main() {
	//接收错误信息和正确信息
	result,err := test(5,0)
	//加了判断,如果没有错误err=nil
	if err!=nil{
		fmt.Println(err)
	}else {
		fmt.Println(result)
	}
}
//b为0时抛出异常
func test(a,b int) (result int, err error) {  //返回错误信息
	err = nil
	if b==0{
		err =errors.New("b不能为0")
	}else {
		result = a/b
	}
	return
}

panic函数

error返回的是一般性的错误,但是panic函数返回的是让程序崩溃的错误。

一般而言,当panic异常发生时,程序会中断运行。

所以,我们在实际的开发过程中并不会直接调用panic( )函数,但是当我们编程的程序遇到致命错误时,系统会自动调用该函数来终止整个程序的运行,也就是系统内置了panic函数。

案例

package main
import "fmt"
func main() {
	test1()
	test2()
	test3()

}
func test1()  {
	fmt.Println("test1")
}
func test2()  {
	panic("panic test2")  //程序中断
}
func test3()  {
	fmt.Println("test3")
}

结果:

test1
panic: panic test2
goroutine 1 [running]:
main.test2(...)

defer延迟

总结

关键字 defer⽤于延迟一个函数的执行,调用了,但是没有执行,也会完成参数的传递

defer fmt.Println("333")
defer fmt.Println("222")
defer fmt.Println("111")

依次输出顺序:111,222,333

如果一个函数中有多个defer语句,它们会以后进先出的顺序执行。
注意,defer语句只能出现在函数的内部。

defer与匿名函数结合使用

案例1:无参数

package main
import "fmt"
func main() {
	a := 10
	b := 20
	defer func() {
		fmt.Println("匿名函数a", a)
		fmt.Println("匿名函数b", b)
	}()
	a = 100
	b = 200
	fmt.Println("main函数a", a)
	fmt.Println("main函数b", b)
}

结果:

main函数a 100
main函数b 200
匿名函数a 100
匿名函数b 200

案例二:有参数

package main
import "fmt"
func main() {
	a := 10
	b := 20
  //调用了,也传参数了,但是没有执行
	defer func(a,b int) { //添加参数
		fmt.Println("匿名函数a", a)
		fmt.Println("匿名函数b", b)
	}(a,b)  //传参数
	a = 100
	b = 200
	fmt.Println("main函数a", a)
	fmt.Println("main函数b", b)
}

结果:

main函数a 100
main函数b 200
匿名函数a 10
匿名函数b 20

recover防止程序中断

运行时panic异常一旦被引发就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。

Go语言为我们提供了专用于“拦截”运行时panic的内建函数——recover。它可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。

注意:recover只有在defer调用的函数中有效。

func testA()  {
    fmt.Println("testA")
}
func testB(x int)  {
    //设置recover()
    //在defer调用的函数中使用recover()
    defer func() {
        //防止程序崩溃
        //recover()
        //fmt.Println(recover())
				//加了一层判断
        if err:=recover();err!=nil {
            fmt.Println(err)
        }
    }()  //匿名函数
    var a [3]int
    a[x] = 999
}
func testC()  {
    fmt.Println("testC")
}
func main() {
    testA()
    testB(0)  //发生异常 中断程序
    testC()
}

以上就是GO语言中err接口及defer延迟异常处理分析的详细内容!

Golang 相关文章推荐
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Go语言入门exec的基本使用
May 20 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 #Golang
golang的文件创建及读写操作
Apr 14 #Golang
golang定时器
Apr 14 #Golang
golang用type-switch判断interface的实际存储类型
Apr 14 #Golang
golang语言指针操作
Apr 14 #Golang
golang使用map实现去除重复数组
Apr 14 #Golang
golang生成并解析JSON
Apr 14 #Golang
You might like
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
python烟花效果的代码实例
2020/02/25 Python
英国领先的游戏零售商:GAME
2019/09/24 全球购物
new修饰符是起什么作用
2015/06/28 面试题
Ajax和javascript的区别
2013/07/20 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
材料采购员岗位职责
2013/12/17 职场文书
班级安全教育实施方案
2014/02/23 职场文书
党员干部公开承诺书
2014/03/26 职场文书
销售活动策划方案
2014/08/26 职场文书
个人授权委托书范本
2014/09/14 职场文书
国情备忘录观后感
2015/06/04 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android