zoukankan      html  css  js  c++  java
  • 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(指针);

    拆分为:

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

  • 相关阅读:
    《全职高手》的全部职业和职业技能(最新版)
    博客园样式美化
    科幻电影免费百度云分享(Scince-fiction cloud share)
    阅读须知
    Website's Game source code
    #P2010 回文日期 的题解
    #P1909 买铅笔 的题解
    #P4770 [NOI2018]你的名字 的题解
    #1074 骑士问题 的题解
    [C++基本语法:从菜鸟变成大佬系列,就像1,2,3那么简单](七):C++的修饰符
  • 原文地址:https://www.cnblogs.com/mylly/p/9244418.html
Copyright © 2011-2022 走看看