美文网首页GolangGolang 入门资料+笔记深入浅出golang
Go 学习之路: 异常处理defer,panic,recover

Go 学习之路: 异常处理defer,panic,recover

作者: 子恒haley | 来源:发表于2018-06-29 17:11 被阅读22次

    Go没有像Java那样的异常机制,它不能抛出异常。因为设计者们认为,将异常与控制结构混在一起容易使得代码变得混乱。于是乎引入Exception处理: defer,panic,recover;

    简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。

    例子代码:

    package main
    
    import "fmt"
    
    func demo(){
        fmt.Println("Welcome, my name is fudomine")
        panic(400)
        fmt.Println("Hello")
    }
    
    func main(){
        defer func(){
            fmt.Println("defer start")
            errorMsg := recover()
            fmt.Println("Error msg :", errorMsg)
            fmt.Println("defer end")
        }()
        demo()
    }
    
    

    运行结果


    运行结果

    defer

    defer 英文原意: vi. 推迟;延期;服从 vt. 使推迟;使延期。

    • Go语言中内置函数;类似于C/PHP的析构函数,但它不是针对对象而是函数;
    • 允许在函数中添加多个defer语句。当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回(类似堆栈,先进后出)。
    • 调用时须在程序结束前调用,简单来说让defer语句在return/panic前写入至内存中;
    func demo()(str string){
        str = "Hello"
        defer func() {
            str = "Welcome, my  name is fudomine"
        }()
        return
    }
    

    返回结果:Welcome, my name is fudomine

    func demo()(str string){
        str = "Hello"
        return
        defer func() {
            str = "Welcome, my  name is fudomine"
        }()
        return
    }
    

    返回结果:Hello

    可能会有小伙伴自己编写代码后,答案不一致;为此特贴出不一样结果的例子代码并进行分析;

    func demo()(string){
        str := "Hello"
    
        defer func() {
            str = "Welcome, my  name is fudomine"
        }()
        return str
    }
    

    原因:defer 中return xxx这一条语句并不是一条原子指令,而上面结果是因为初始化时候就声明输出类型是*T(指针);

    拆分为:

    panic

    panic 英文原意:n. 恐慌,惊慌;大恐慌 adj. 恐慌的;没有理由的 vt. 使恐慌 vi. 十分惊慌

    • Go是一个内建函数,可以中断原有的控制流程,进入一个异常的流程中。当函数 Func 调用 panic ,函数Func 的执行被中断,但是 Func 中的延迟函数会正常执行,然后Func 返回到调用它的地方。在调用的地方, Func 的行为就像调用了 panic 。这一过程继续向上(只有刚才defer寸在内存中,将会被调用),直到发生 panic 的 goroutine 中所有调用的函数返回,此时程序退出。

    recover

    recover 英文原意: vt. 恢复;弥补;重新获得 vi. 恢复;胜诉;重新得球 n. 还原至预备姿势

    • Go是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。 recover 仅在延迟函数中有效。在正常的执行过程中,调用 recover 会返回 nil ,并且没有其它任何效果。如果当前的 goroutine 陷入恐慌,调用recover 可以捕获到 panic 的输入值,并且恢复正常的执行。

    参考文献
    《go web编程》

    作者:不动峰
    博客园:http://www.cnblogs.com/mylly/
    版权所有,欢迎保留原文链接进行转载:)

    相关文章

      网友评论

        本文标题:Go 学习之路: 异常处理defer,panic,recover

        本文链接:https://www.haomeiwen.com/subject/akgayftx.html