<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    咖啡伴侶

    呆在上海
    posts - 163, comments - 156, trackbacks - 0, articles - 2

    Golang 異常處理

    Posted on 2013-09-22 09:32 oathleo 閱讀(2243) 評論(0)  編輯  收藏 所屬分類: Golang

    Panic和Recover

    Go沒有像Java那樣的異常機制,它不能拋出異常,而是使用了panicrecover機制。一定要記住,你應當把它作為最后的手段來使用,也就是說,你的代碼中應當沒有,或者很少有panic的東西。這是個強大的工具,請明智地使用它。那么,我們應該如何使用它呢?

    Panic

    是一個內建函數,可以中斷原有的控制流程,進入一個令人恐慌的流程中。當函數F調用panic,函數F的執行被中斷,但是F中的延遲函數會正常執行,然后F返回到調用它的地方。在調用的地方,F的行為就像調用了panic。這一過程繼續向上,直到發生panicgoroutine中所有調用的函數返回,此時程序退出。恐慌可以直接調用panic產生。也可以由運行時錯誤產生,例如訪問越界的數組。

    Recover

    是一個內建的函數,可以讓進入令人恐慌的流程中的goroutine恢復過來。recover僅在延遲函數中有效。在正常的執行過程中,調用recover會返回nil,并且沒有其它任何效果。如果當前的goroutine陷入恐慌,調用recover可以捕獲到panic的輸入值,并且恢復正常的執行。

    下面這個函數演示了如何在過程中使用panic

    var user = os.Getenv("USER")  func init() {     if user == "" {         panic("no value for $USER")     } } 

    下面這個函數檢查作為其參數的函數在執行時是否會產生panic

    func throwsPanic(f func()) (b bool) {     defer func() {         if x := recover(); x != nil {             b = true         }     }()     f() //執行函數f,如果f中出現了panic,那么就可以恢復回來     return } 

    最容易理解就是給個例子,文章里有例子:

    package main  import(     "fmt"     //"os" )  var user = "" func inita() {     defer func(){         fmt.Print("defer##\n")     }()     if user == "" {         fmt.Print("@@@before panic\n")         panic("no value for user\n")         fmt.Print("!!after panic\n")     } }  func throwsPanic (f func()) (b bool){     defer func(){         if x:= recover(); x != nil{             fmt.Print(x)             b = true         }     }()     f()     fmt.Print("after the func run")     return }  func main(){     throwsPanic(inita) } 

    執行結果:

    D:\go>go run b.go
    @@@before panic
    defer##
    no value for user

    如上面所說的:

    panicuser=""時,打斷了函數的執行,fmt.Print("!!after panic\n")沒有執行。 但函數中的延遲函數會正常執行,打印了 defer##。然后返回到調用該函數的地方,繼續上面的過程。

    直到執行完所有函數的defer,退出程序。Recover可以捕獲到panic的值,上面的打印no value for user。并且恢復正常的執行。

    主站蜘蛛池模板: 亚洲精品国产电影午夜| 国产亚洲精久久久久久无码77777| 亚洲成亚洲乱码一二三四区软件| 一级做a爰片久久毛片免费陪| 国产精品免费视频播放器| 亚洲精品人成网线在线播放va | 人成午夜免费视频在线观看| 亚洲an天堂an在线观看| a色毛片免费视频| 久久亚洲精品成人| 精品无码无人网站免费视频| 97se亚洲综合在线| 男女超爽刺激视频免费播放 | 亚洲中文字幕无码av永久| 免费A级毛片无码无遮挡内射| 亚洲人成免费网站| 成人午夜18免费看| 亚洲国产精品成人综合色在线| 国产精品极品美女免费观看| 美女被爆羞羞网站在免费观看| 亚洲成A∨人片天堂网无码| 2022国内精品免费福利视频| 亚洲综合av永久无码精品一区二区 | 国产免费变态视频网址网站| 一级A毛片免费观看久久精品| 亚洲男女内射在线播放| 成人无码a级毛片免费| 久久精品国产亚洲AV无码偷窥| 精品香蕉在线观看免费| 亚洲色无码国产精品网站可下载| 国产一区二区三区免费看| jizz免费观看| 91亚洲国产在人线播放午夜| 女人张开腿给人桶免费视频| 亚洲av无码成人影院一区| 亚洲伊人色欲综合网| 国产精彩免费视频| 免费无遮挡无遮羞在线看| 亚洲国产精品自在在线观看| 大陆一级毛片免费视频观看| aa级女人大片喷水视频免费|