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 interface判断为空nil的实现代码
Apr 24 Golang
Go语言中的UTF-8实现
Apr 26 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
go类型转换及与C的类型转换方式
May 05 Golang
go 实现简易端口扫描的示例
May 22 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang jwt身份认证
Apr 20 Golang
Go语言测试库testify使用学习
Jul 23 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
PHP静态类
2006/11/25 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
javascript 二分法(数组array)
2010/04/24 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
python实现简单中文词频统计示例
2017/11/08 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
司机辞职报告范文
2014/01/20 职场文书
室内拓展活动方案
2014/02/13 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
2014年副班长工作总结
2014/12/10 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL