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结构体嵌套的切片数组操作
Apr 28 Golang
使用golang编写一个并发工作队列
May 08 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go 语言结构实例分析
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 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 mysql 判断update之后是否更新了的方法
2012/01/10 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
Pandas的数据过滤实现
2021/01/15 Python
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
活动总结报告怎么写
2014/07/03 职场文书
地震慰问信
2015/02/14 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python