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
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang中的空slice案例
Apr 27 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
解决Go gorm踩过的坑
Apr 30 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Golang 结构体数据集合
Apr 22 Golang
Golang入门之计时器
May 04 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
Go语言编译原理之变量捕获
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 var_dump()函数的详解
2013/06/05 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
python里反向传播算法详解
2020/11/22 Python
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
电子商务网站的创业计划书
2014/01/05 职场文书
车辆年检委托书范本
2014/10/14 职场文书
2014年保卫工作总结
2014/12/05 职场文书
计划生育个人总结
2015/03/02 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
python实现局部图像放大
2021/11/17 Python
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android