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判断key是否在map中的代码
Apr 24 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang定时器
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 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
根德YB400的电路分析
2021/03/02 无线电
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
js页面跳转常用的几种方式
2010/11/25 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
python使用post提交数据到远程url的方法
2015/04/29 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
keras得到每层的系数方式
2020/06/15 Python
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
儿媳婚宴答谢词
2014/01/14 职场文书
高中物理教学反思
2014/02/08 职场文书
英语教师求职信
2014/06/16 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android