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 26 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
go类型转换及与C的类型转换方式
May 05 Golang
golang 实现并发求和
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang map映射的用法
Apr 22 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
Go语言编译原理之变量捕获
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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP基础知识回顾
2012/08/16 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
python自动化测试之连接几组测试包实例
2014/09/28 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
装饰资料员岗位职责
2013/12/30 职场文书
上班离岗检讨书
2014/01/27 职场文书
物理课外活动总结
2014/08/27 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL