GO语言中err接口及defer延迟异常处理分析

GO语言中err接口及defer延迟异常处理分析

目录

err接口

panic函数

defer延迟

defer与匿名函数结合使用

recover防止程序中断

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延迟异常处理分析的详细内容,更多关于GO语言err接口defer延迟异常的资料请关注易知道(ezd.cc)其它相关文章!

推荐阅读

    公共CPU接口类型的详细描述

    公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的处理速度直接决定电脑的性能, 那你知道CPU发展到现在, 都那些CPU接口类型吗.

    FM1和AM3接口将在今年年底前淘汰

    FM1和AM3接口将在今年年底前淘汰,,据来自主板制造商的消息,AMD将开始逐步淘汰Socket FM1和Socket AM3接口从本月开始的处理器,最后消失在第

    Windows8开发版系统高清系统接口图

    Windows8开发版系统高清系统接口图,,今天,微软发布,目前由开发者体验版Windows 8操作系统为整个英文系统,Windows 8带来了一系列新功能,没有折

    探探语言设置|探探怎么设置语言

    探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

    git设置编码|git语言设置

    git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高

    「显卡上的接口」显卡上的接口有几种

    「显卡上的接口」显卡上的接口有几种,显卡上的接口,本篇文章给大家谈谈显卡上的接口,以及显卡上的接口有几种对应的知识点,希望对各位有所帮

    支持DDR3!AM3接口790gx主板的评价

    支持DDR3!AM3接口790gx主板的评价,,二月,在主板市场,各种各样的AM3主板将推出。对Phenom II处理器的刺激下,每一个主板制造商不能忽视这样一个