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 相关文章推荐
解决goland 导入项目后import里的包报红问题
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Go timer如何调度
Jun 09 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 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
桌面中心(二)数据库写入
2006/10/09 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
微信小程序 欢迎页面的制作(源码下载)
2017/01/09 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
js实现简易ATM功能
2020/10/27 Javascript
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
品牌宣传方案
2014/03/21 职场文书
网络营销计划
2015/01/17 职场文书
财务工作失误检讨书
2015/02/19 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS