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 相关文章推荐
go语言中json数据的读取和写出操作
Apr 28 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
go语言中fallthrough的用法说明
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Go语言怎么使用变长参数函数
Jul 15 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+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
Prototype使用指南之selector.js
2007/01/10 Javascript
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
div层的移动及性能优化
2010/11/16 Javascript
jquery 使用简明教程
2014/03/05 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python入门必须知道的11个知识点
2018/03/21 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
python从Oracle读取数据生成图表
2020/10/14 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
C# Debug和Testing相关面试题
2015/10/25 面试题
Shell如何接收变量输入
2016/08/06 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
2015年人事科工作总结
2015/04/28 职场文书
工程竣工验收申请报告
2015/05/15 职场文书
厉行节约工作总结
2015/08/12 职场文书
导游词之南京中山陵
2019/11/27 职场文书