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 相关文章推荐
golang interface判断为空nil的实现代码
Apr 24 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Golang之sync.Pool使用详解
May 06 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
Golang gRPC HTTP协议转换示例
Jun 16 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
基于MySQL分区性能的详细介绍
2013/05/02 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
Yii核心验证器api详解
2016/11/23 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
python做反被爬保护的方法
2019/07/01 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
了解一下python内建模块collections
2020/09/07 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
采购助理岗位职责
2014/02/16 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
音乐幼师求职信
2014/07/09 职场文书
基层党建工作简报
2015/07/21 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
python代码实现扫码关注公众号登录的实战
2021/11/01 Python