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在函数退出后子协程的退出问题
Apr 30 Golang
golang 比较浮点数的大小方式
May 02 Golang
goland 设置project gopath的操作
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
golang中的struct操作
Nov 11 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang jwt身份认证
Apr 20 Golang
Golang 实现WebSockets
Apr 24 Golang
深入理解 Golang 的字符串
May 04 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验证码函数的使用示例
2013/05/03 PHP
PHP查询快递信息的方法
2015/03/07 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
javascript制作2048游戏
2015/03/30 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
美国最大的团购网站:Groupon
2016/07/23 全球购物
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
材料物理专业个人求职信
2013/12/15 职场文书
领导党性分析材料
2014/02/15 职场文书
求职信结尾怎么写
2014/05/26 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
农村文化活动总结
2014/08/28 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
详解如何使用Nginx解决跨域问题
2022/05/06 Servers