文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

GO语言中err接口及defer延迟异常怎么处理

2023-06-30 03:13

关注

这篇“GO语言中err接口及defer延迟异常怎么处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“GO语言中err接口及defer延迟异常怎么处理”文章吧。

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 mainimport ("errors""fmt")func main() {//接收错误信息和正确信息result,err := test(5,0)//加了判断,如果没有错误err=nilif err!=nil{fmt.Println(err)}else {fmt.Println(result)}}//b为0时抛出异常func test(a,b int) (result int, err error) {  //返回错误信息err = nilif b==0{err =errors.New("b不能为0")}else {result = a/b}return}

panic函数

error返回的是一般性的错误,但是panic函数返回的是让程序崩溃的错误。

一般而言,当panic异常发生时,程序会中断运行。

所以,我们在实际的开发过程中并不会直接调用panic( )函数,但是当我们编程的程序遇到致命错误时,系统会自动调用该函数来终止整个程序的运行,也就是系统内置了panic函数。

案例

package mainimport "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 mainimport "fmt"func main() {a := 10b := 20defer func() {fmt.Println("匿名函数a", a)fmt.Println("匿名函数b", b)}()a = 100b = 200fmt.Println("main函数a", a)fmt.Println("main函数b", b)}

结果:

main函数a 100
main函数b 200
匿名函数a 100
匿名函数b 200

案例二:有参数

package mainimport "fmt"func main() {a := 10b := 20  //调用了,也传参数了,但是没有执行defer func(a,b int) { //添加参数fmt.Println("匿名函数a", a)fmt.Println("匿名函数b", b)}(a,b)  //传参数a = 100b = 200fmt.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延迟异常怎么处理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯