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

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(指针);

拆分为:
* 返回值 = xxx
* 调用defer函数
* 空的return
详细请参考下《深入解析GO》一文

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/
版权所有,欢迎保留原文链接进行转载:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值