温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-04-15 10:30:27 来源:亿速云 阅读:174 作者:iii 栏目:开发技术

这篇“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 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延迟异常怎么处理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI