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中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang json数组拼接的实例
Apr 28 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
Go 自定义package包设置与导入操作
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
golang的文件创建及读写操作
Apr 14 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Golang gRPC HTTP协议转换示例
Jun 16 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+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
移动端js图片查看器
2016/11/17 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
平面设计岗位职责
2013/12/14 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
财务部岗位职责
2015/02/03 职场文书
好好学习保证书
2015/02/26 职场文书
js Proxy的原理详解
2021/05/25 Javascript