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 如何用反射reflect操作结构体
Apr 28 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Golang的继承模拟实例
Jun 30 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
golang定时器
Apr 14 Golang
Golang map映射的用法
Apr 22 Golang
Golang 入门 之url 包
May 04 Golang
Golang入门之计时器
May 04 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编程中的__clone()方法使用详解
2015/11/27 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
php生出随机字符串
2017/07/06 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
windows下ipython的安装与使用详解
2016/10/20 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
化工专业自荐书
2014/06/16 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
环保项目建议书
2014/08/26 职场文书
博士论文答辩开场白
2015/06/01 职场文书
于丹论语心得观后感
2015/06/15 职场文书
2015教师节通讯稿
2015/07/20 职场文书
社区服务活动感想
2015/08/11 职场文书
关于五一放假的通知
2015/08/18 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python