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如何去除多余空白字符(含制表符)
Apr 25 Golang
golang中的空slice案例
Apr 27 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang 实现Location跳转方式
May 02 Golang
Golang的继承模拟实例
Jun 30 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
golang内置函数len的小技巧
Jul 25 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
深入理解 Golang 的字符串
May 04 Golang
Go web入门Go pongo2模板引擎
May 20 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学习笔记(毕业设计)
2012/02/21 PHP
php读取excel文件的简单实例
2013/08/26 PHP
php常用文件操作函数汇总
2014/11/22 PHP
php中使用GD库做验证码
2016/03/31 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
php生成word并下载代码实例
2019/03/15 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
vue实现的下拉框功能示例
2019/01/29 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
建筑工程实习自我鉴定
2013/09/19 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
党员倡议书
2015/01/19 职场文书
高中教师个人总结
2015/02/10 职场文书
孝女彩金观后感
2015/06/10 职场文书
运动会口号霸气押韵
2015/12/24 职场文书